]> granicus.if.org Git - curl/commitdiff
curl: check fseek() return code and bail on error
authorDaniel Stenberg <daniel@haxx.se>
Wed, 20 Sep 2017 10:03:44 +0000 (12:03 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 20 Sep 2017 10:03:44 +0000 (12:03 +0200)
Detected by coverity. CID 1418137.

src/tool_operate.c

index f32558af522b8ec29a01d06b5f4ff469e2587db8..6dd05dbf49ca8b37df40095fc5cd8eeec117dcd5 100644 (file)
@@ -1668,6 +1668,7 @@ static CURLcode operate_do(struct GlobalConfig *global,
                   retry_sleep = RETRY_SLEEP_MAX;
               }
               if(outs.bytes && outs.filename && outs.stream) {
+                int rc;
                 /* We have written data to a output file, we truncate file
                  */
                 if(!global->mute)
@@ -1688,14 +1689,21 @@ static CURLcode operate_do(struct GlobalConfig *global,
                 }
                 /* now seek to the end of the file, the position where we
                    just truncated the file in a large file-safe way */
-                fseek(outs.stream, 0, SEEK_END);
+                rc = fseek(outs.stream, 0, SEEK_END);
 #else
                 /* ftruncate is not available, so just reposition the file
                    to the location we would have truncated it. This won't
                    work properly with large files on 32-bit systems, but
                    most of those will have ftruncate. */
-                fseek(outs.stream, (long)outs.init, SEEK_SET);
+                rc = fseek(outs.stream, (long)outs.init, SEEK_SET);
 #endif
+                if(rc) {
+                  if(!global->mute)
+                    fprintf(global->errors,
+                            "failed seeking to end of file, exiting\n");
+                  result = CURLE_WRITE_ERROR;
+                  goto quit_urls;
+                }
                 outs.bytes = 0; /* clear for next round */
               }
               continue; /* curl_easy_perform loop */