diff options
author | NRK <nrk@disroot.org> | 2024-11-11 20:04:38 +0000 |
---|---|---|
committer | NRK <nrk@disroot.org> | 2024-11-11 20:07:25 +0000 |
commit | 43c69abbacf2617163c50516871d570ecdeffd84 (patch) | |
tree | 3432ac780c8bac92cc66c17757d235ce1c1ce357 | |
parent | 614ebe73fa3250dfbdbf5f4a8dc0150ef239236a (diff) |
fix crash under _FORTIFY_SOURCE
when built with _FORTIFY_SOURCE it will check whether the buffer
has as much space as the argument passed to snprintf:
https://github.com/bminor/glibc/blob/7b544224f82d20019f9b28522ebf8114a372d1a2/debug/snprintf_chk.c#L28-L29
this results in some false positives when the snprintf provided
len argument is bigger than the buffer size (but the result
would have fit into the buffer anyways).
fix this by passing the proper size to snprintf as argument.
(the +1 len isn't necessary, but add it just in case.)
Fixes: https://github.com/jarun/nnn/issues/1931
-rw-r--r-- | src/nnn.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -2834,15 +2834,16 @@ static char *get_archive_cmd(const char *archive) static void archive_selection(const char *cmd, const char *archive) { - char *buf = malloc((xstrlen(patterns[P_ARCHIVE_CMD]) + xstrlen(cmd) + xstrlen(archive) - + xstrlen(selpath)) * sizeof(char)); + size_t len = xstrlen(patterns[P_ARCHIVE_CMD]) + xstrlen(cmd) + xstrlen(archive) + + xstrlen(selpath) + 1; + char *buf = malloc(len); if (!buf) { DPRINTF_S(strerror(errno)); printwarn(NULL); return; } - snprintf(buf, CMD_LEN_MAX, patterns[P_ARCHIVE_CMD], cmd, archive, selpath); + snprintf(buf, len, patterns[P_ARCHIVE_CMD], cmd, archive, selpath); spawn(utils[UTIL_SH_EXEC], buf, NULL, NULL, F_CLI | F_CONFIRM); free(buf); } |