diff options
author | Timo Teräs <timo.teras@iki.fi> | 2019-02-13 15:44:03 +0200 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2019-02-13 16:05:27 +0200 |
commit | 44daf808737f85ff462905269c7a1e66d52e2fff (patch) | |
tree | 08a62633282647b9695adc2a460b1dbe0799bab6 | |
parent | 86922d1a34fc1004f439b0b86bfbd908a9f07422 (diff) | |
download | apk-tools-44daf808737f85ff462905269c7a1e66d52e2fff.tar.gz apk-tools-44daf808737f85ff462905269c7a1e66d52e2fff.tar.bz2 apk-tools-44daf808737f85ff462905269c7a1e66d52e2fff.tar.xz apk-tools-44daf808737f85ff462905269c7a1e66d52e2fff.zip |
fix strncpy bounds errors
error: 'strncpy' specified bound 4096 equals destination size [-Werror=stringop-truncation]
Based on patch by Elan Ruusamäe <glen@delfi.ee>
-rw-r--r-- | libfetch/http.c | 4 | ||||
-rw-r--r-- | src/apk_blob.h | 4 | ||||
-rw-r--r-- | src/archive.c | 6 | ||||
-rw-r--r-- | src/blob.c | 13 | ||||
-rw-r--r-- | src/database.c | 5 |
5 files changed, 26 insertions, 6 deletions
diff --git a/libfetch/http.c b/libfetch/http.c index 638c9a8..5a515cb 100644 --- a/libfetch/http.c +++ b/libfetch/http.c @@ -496,10 +496,10 @@ http_next_header(conn_t *conn, const char **p) static int http_parse_mtime(const char *p, time_t *mtime) { - char locale[64], *r; + char *locale, *r; struct tm tm; - strncpy(locale, setlocale(LC_TIME, NULL), sizeof(locale)); + locale = strdupa(setlocale(LC_TIME, NULL)); setlocale(LC_TIME, "C"); r = strptime(p, "%a, %d %b %Y %H:%M:%S GMT", &tm); /* XXX should add support for date-2 and date-3 */ diff --git a/src/apk_blob.h b/src/apk_blob.h index 4fdd3be..c14980d 100644 --- a/src/apk_blob.h +++ b/src/apk_blob.h @@ -133,4 +133,8 @@ void apk_atom_init(void); apk_blob_t *apk_blob_atomize(apk_blob_t blob); apk_blob_t *apk_blob_atomize_dup(apk_blob_t blob); +#if defined(__GLIBC__) && !defined(__UCLIBC__) +extern size_t strlcpy(char *dest, const char *src, size_t size); +#endif + #endif diff --git a/src/archive.c b/src/archive.c index 1745056..724410c 100644 --- a/src/archive.c +++ b/src/archive.c @@ -387,10 +387,10 @@ int apk_tar_write_entry(struct apk_ostream *os, const struct apk_file_info *ae, return -1; if (ae->name != NULL) - strncpy(buf.name, ae->name, sizeof(buf.name)); + strlcpy(buf.name, ae->name, sizeof buf.name); - strncpy(buf.uname, ae->uname ?: "root", sizeof(buf.uname)); - strncpy(buf.gname, ae->gname ?: "root", sizeof(buf.gname)); + strlcpy(buf.uname, ae->uname ?: "root", sizeof buf.uname); + strlcpy(buf.gname, ae->gname ?: "root", sizeof buf.gname); PUT_OCTAL(buf.size, ae->size); PUT_OCTAL(buf.uid, ae->uid); @@ -717,3 +717,16 @@ apk_blob_t *apk_blob_atomize_dup(apk_blob_t blob) return &atom->blob; } + +#if defined(__GLIBC__) && !defined(__UCLIBC__) +size_t strlcpy(char *dst, const char *src, size_t size) +{ + size_t ret = strlen(src), len; + if (!size) return ret; + len = ret; + if (len >= size) len = size - 1; + memcpy(dest, src, len); + dst[len] = 0; + return ret; +} +#endif diff --git a/src/database.c b/src/database.c index 8e58785..5bffb43 100644 --- a/src/database.c +++ b/src/database.c @@ -2787,7 +2787,10 @@ static int apk_db_unpack_pkg(struct apk_database *db, if (!(pkg->repos & db->local_repos)) need_copy = TRUE; } else { - strncpy(file, pkg->filename, sizeof(file)); + if (strlcpy(file, pkg->filename, sizeof file) >= sizeof file) { + r = -ENAMETOOLONG; + goto err_msg; + } need_copy = TRUE; } if (!apk_db_cache_active(db)) |