aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2019-02-18 09:07:34 +0100
committerDaniel Stenberg <daniel@haxx.se>2019-02-18 14:57:38 +0100
commitaf143ef45e308a38900a9550c7fffb7f5734a97e (patch)
tree563febe7d89bd4766f96c1fe6c7c941bcf3f97f5
parentf26bc29cfec0be84c67cf74065cf8e5e78fd68b7 (diff)
examples/http2-serverpush: add some sensible error checks
To avoid NULL pointer dereferences etc in the case of problems. Closes #3580
-rw-r--r--docs/examples/http2-serverpush.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/docs/examples/http2-serverpush.c b/docs/examples/http2-serverpush.c
index 66abb0f9b..63dff4cec 100644
--- a/docs/examples/http2-serverpush.c
+++ b/docs/examples/http2-serverpush.c
@@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -128,9 +128,12 @@ int my_trace(CURL *handle, curl_infotype type,
#define OUTPUTFILE "dl"
-static void setup(CURL *hnd)
+static int setup(CURL *hnd)
{
FILE *out = fopen(OUTPUTFILE, "wb");
+ if(!out)
+ /* failed */
+ return 1;
/* write to this file */
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, out);
@@ -153,7 +156,7 @@ static void setup(CURL *hnd)
/* wait for pipe connection to confirm */
curl_easy_setopt(hnd, CURLOPT_PIPEWAIT, 1L);
#endif
-
+ return 0; /* all is good */
}
/* called when there's an incoming push */
@@ -176,6 +179,11 @@ static int server_push_callback(CURL *parent,
/* here's a new stream, save it in a new file for each new push */
out = fopen(filename, "wb");
+ if(!out) {
+ /* if we can't save it, deny it */
+ fprintf(stderr, "Failed to create output file for push\n");
+ return CURL_PUSH_DENY;
+ }
/* write to this file */
curl_easy_setopt(easy, CURLOPT_WRITEDATA, out);
@@ -215,7 +223,10 @@ int main(void)
easy = curl_easy_init();
/* set options */
- setup(easy);
+ if(setup(easy)) {
+ fprintf(stderr, "failed\n");
+ return 1;
+ }
/* add the easy transfer */
curl_multi_add_handle(multi_handle, easy);