Download raw body.
move got_pkt_readlen() to separate function
We'll need this in got-fetch-http ----------------------------------------------- commit 98fc2289f1bf714314940fbb725d95ea15ced3f1 (xdigit) from: Tobias Heider <me@tobhe.de> date: Tue Apr 16 16:30:10 2024 UTC Make got_pkt_readlen() a separate function. There are multiple places where we need to parse strings with the same format. diff 3bdb50664480ef16bc57431ac739d4010133d2a2 98fc2289f1bf714314940fbb725d95ea15ced3f1 commit - 3bdb50664480ef16bc57431ac739d4010133d2a2 commit + 98fc2289f1bf714314940fbb725d95ea15ced3f1 blob - 009561888bba0c0f18ea02211c6639bf87cfb368 blob + 8295c80b38111178704802e1cfa5b090781c7ed5 --- lib/got_lib_pkt.h +++ lib/got_lib_pkt.h @@ -20,6 +20,7 @@ const struct got_error *got_pkt_readn(ssize_t *off, int fd, void *buf, size_t n); const struct got_error *got_pkt_flushpkt(int fd, int chattygot); +const struct got_error *got_pkt_readlen(int *len, const char *str, int chattygot); const struct got_error *got_pkt_readhdr(int *datalen, int fd, int chattygot); const struct got_error *got_pkt_readpkt(int *outlen, int fd, char *buf, int buflen, int chattygot); blob - fad7f03e4f70f1513ceb7af03bb71e1e7907a950 blob + 6bb2b9c99379691b62c97f575b8b014e0c0e5a5d --- lib/pkt.c +++ lib/pkt.c @@ -58,6 +58,37 @@ got_pkt_flushpkt(int fd, int chattygot) return NULL; } +const struct got_error * +got_pkt_readlen(int *len, const char *str, int chattygot) +{ + char *e; + int i; + + *len = 0; + for (i = 0; i < 4; i++) { + if (!isprint((unsigned char)str[i])) + return got_error_msg(GOT_ERR_BAD_PACKET, + "unprintable character in pkt-line length field"); + } + for (i = 0; i < 4; i++) { + if (!isxdigit((unsigned char)str[i])) { + if (chattygot) + fprintf(stderr, "%s: bad length: '%s'\n", + getprogname(), str); + return got_error_msg(GOT_ERR_BAD_PACKET, + "packet length not specified in hex"); + } + } + errno = 0; + *len = strtol(str, &e, 16); + if (str[0] == '\0' || *e != '\0') + return got_error(GOT_ERR_BAD_PACKET); + if (errno == ERANGE || *len > INT_MAX || *len < INT_MIN) + return got_error_msg(GOT_ERR_BAD_PACKET, "bad pkt-line length"); + + return NULL; +} + /* * Packet header contains a 4-byte hexstring which specifies the length * of data which follows. @@ -65,12 +96,10 @@ got_pkt_flushpkt(int fd, int chattygot) const struct got_error * got_pkt_readhdr(int *datalen, int fd, int chattygot) { - static const struct got_error *err = NULL; + static const struct got_error *err; char lenstr[5]; - long len; - char *e; - int n, i; ssize_t r; + int n; *datalen = 0; @@ -86,36 +115,14 @@ got_pkt_readhdr(int *datalen, int fd, int chattygot) if (r != 4) return got_error_msg(GOT_ERR_BAD_PACKET, "wrong packet header length"); - lenstr[4] = '\0'; - for (i = 0; i < 4; i++) { - if (!isprint((unsigned char)lenstr[i])) - return got_error_msg(GOT_ERR_BAD_PACKET, - "unprintable character in packet length field"); - } - for (i = 0; i < 4; i++) { - if (!isxdigit((unsigned char)lenstr[i])) { - if (chattygot) - fprintf(stderr, "%s: bad length: '%s'\n", - getprogname(), lenstr); - return got_error_msg(GOT_ERR_BAD_PACKET, - "packet length not specified in hex"); - } - } - errno = 0; - len = strtol(lenstr, &e, 16); - if (lenstr[0] == '\0' || *e != '\0') - return got_error(GOT_ERR_BAD_PACKET); - if (errno == ERANGE && (len == LONG_MAX || len == LONG_MIN)) - return got_error_msg(GOT_ERR_BAD_PACKET, "bad packet length"); - if (len > INT_MAX || len < INT_MIN) - return got_error_msg(GOT_ERR_BAD_PACKET, "bad packet length"); - n = len; + + err = got_pkt_readlen(&n, lenstr, chattygot); if (n == 0) - return NULL; + return err; if (n <= 4) return got_error_msg(GOT_ERR_BAD_PACKET, "packet too short"); - n -= 4; + n -= 4; *datalen = n; return NULL;
move got_pkt_readlen() to separate function