← Commit list

d63432d1f8

Daniel Stenberg
Daniel Stenberg
2026-03-26
SUCCESS Duration: 272s

Subject

tool_cb_hdr: only truncate etags output when regular file

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

src/tool_cb_hdr.c+14 -9
@@ -263,18 +263,23 @@ static size_t save_etag(const char *etag_h, const char *endp,
if(eot >= etag_h) {
size_t etag_length = eot - etag_h + 1;
- /*
- * Truncate the etag save stream, it can have an existing etag value.
- */
+ curlx_struct_stat file;
+ int fd = fileno(etag_save->stream);
+
+ if((fd != -1) &&
+ !curlx_fstat(fd, &file) &&
+ (S_ISREG(file.st_mode))) {
+ /*
+ * Truncate regular files to avoid stale etag content.
+ */
#ifdef HAVE_FTRUNCATE
- if(ftruncate(fileno(etag_save->stream), 0)) {
- return CURL_WRITEFUNC_ERROR;
- }
+ if(ftruncate(fileno(etag_save->stream), 0))
+ return CURL_WRITEFUNC_ERROR;
#else
- if(fseek(etag_save->stream, 0, SEEK_SET)) {
- return CURL_WRITEFUNC_ERROR;
- }
+ if(fseek(etag_save->stream, 0, SEEK_SET))
+ return CURL_WRITEFUNC_ERROR;
#endif
+ }
fwrite(etag_h, 1, etag_length, etag_save->stream);
/* terminate with newline */
tests/data/Makefile.am+2 -2
@@ -213,8 +213,8 @@ test1580 test1581 test1582 test1583 test1584 test1585 test1586 \
test1590 test1591 test1592 test1593 test1594 test1595 test1596 test1597 \
test1598 test1599 test1600 test1601 test1602 test1603 test1604 test1605 \
test1606 test1607 test1608 test1609 test1610 test1611 test1612 test1613 \
-test1614 test1615 test1616 test1617 test1618 \
-test1620 test1621 test1622 test1623 test1624 test1625 test1626 test1627 \
+test1614 test1615 test1616 test1617 test1618 test1619 test1620 test1621 \
+test1622 test1623 test1624 test1625 test1626 test1627 \
\
test1630 test1631 test1632 test1633 test1634 test1635 test1636 test1637 \
test1638 \
tests/data/test1619+45 -0
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<testcase>
+<info>
+<keywords>
+HTTP
+HTTP GET
+</keywords>
+</info>
+
+<reply>
+<data nocheck="yes" crlf="headers">
+HTTP/1.1 200 OK
+ETag: W/"heyheyhey"
+Content-Length: 4
+
+yes
+</data>
+</reply>
+
+<client>
+<server>
+http
+</server>
+<name>
+--etag-save to stdout
+</name>
+<command >
+http://%HOSTIP:%HTTPPORT/%TESTNUMBER -O --etag-save -
+</command>
+</client>
+
+<verify>
+<protocol crlf="headers">
+GET /%TESTNUMBER HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+User-Agent: curl/%VERSION
+Accept: */*
+
+</protocol>
+<stdout>
+W/"heyheyhey"
+</stdout>
+</verify>
+
+</testcase>