On 2023/06/25 18:22:31 -0700, a dog <open...@anthropomorphic.dog> wrote: > >Synopsis: ftp(1) will never attempt to set the modification date of any > >file retrieved by http[s] > >Category: user > >Environment: > System : OpenBSD 7.3 > Details : OpenBSD 7.3-current (GENERIC.MP) #1259: Fri Jun 23 > 09:13:33 MDT 2023 > > dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP > > Architecture: OpenBSD.amd64 > Machine : amd64 > >Description: > ftp(1) will always act as if the Last-Modified header returned > by the server is invalid, and set server_timestamps to 0 on line > 989 of usr.bin/ftp/fetch.c. This is because the space following > the colon is not stripped, and therefore strptime(3) will see > something resembling " Sun, 25 Jun 2023 21:38:42 GMT" - > otherwise valid but beginning with a space. The end result is > that file modification stamps will never be set, as if -u had > been specified. > >How-To-Repeat: > 1) Pick any URL that returns a Last-Modified which is valid and > not equal to the time of retrieval, > 2) Now retrieve the same URL using ftp(1). The modification > date is supposed to be set to the value returned by the > server, but will instead be equal to the time the file was > closed by ftp(1). > >Fix: > Thankfully simple. Please see proposed patch below.
Good catch. It's the only header where we forget to skip leading blanks. I can reproduce and confirm that this does indeed fix the parsing and make ftp set the mtime accordingly to Last-Modified. > diff --git i/usr.bin/ftp/fetch.c w/usr.bin/ftp/fetch.c > index 0ba7ad4d099..b6d6f4d775a 100644 > --- i/usr.bin/ftp/fetch.c > +++ w/usr.bin/ftp/fetch.c > @@ -984,6 +984,7 @@ noslash: > } else if (strncasecmp(cp, LAST_MODIFIED, > sizeof(LAST_MODIFIED) - 1) == 0) { > cp += sizeof(LAST_MODIFIED) - 1; > + cp += strspn(cp, " \t"); > cp[strcspn(cp, "\t")] = '\0'; > if (strptime(cp, "%a, %d %h %Y %T %Z", &lmt) == NULL) > server_timestamps = 0;