diff options
author | Eric Wong <normalperson@yhbt.net> | 2006-07-30 10:31:41 +0000 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2006-07-30 10:31:41 +0000 |
commit | 263a9d583a74a94fef652bb40f4035b9c0c1612e (patch) | |
tree | 52f15e2c2d0e60e87bb1a135c55e4345e2511f2f /src/metadataChunk.c | |
parent | 4144afe551eca63366316c013019bce9ad81bc94 (diff) | |
download | mpd-263a9d583a74a94fef652bb40f4035b9c0c1612e.tar.gz mpd-263a9d583a74a94fef652bb40f4035b9c0c1612e.tar.xz mpd-263a9d583a74a94fef652bb40f4035b9c0c1612e.zip |
remove clumsy strncpy use
strncpy isn't really safe because it doesn't guarantee null termination,
and we have had to work around it in several places.
strlcpy (from OpenBSD) isn't great, either because it often leaves
errors going unchecked (by truncating strings).
So we'll add the pathcpy_trunc() function with is basically strlcpy
with a hardcoded MAXPATHLEN as the limit, and we'll acknowledge
truncation since we only work on paths and MAXPATHLEN should be
set correctly by the system headers[1].
file-specific notes:
inputStream_http:
eyeballing the changes here, it seems to look alright but I
haven't actually tested it myself.
ls:
don't even bother printing a file if the filename is too long
(and when is it ever?) since we won't be able to read it anyways.
metadataChunk:
it's only metadata, and it's only for showin the user, so truncating
it here souldn't be a big issue.
memset to zero in init is unecessary, so lets not waste cycles
[1] - If the system headers are screwed up, then we're majorly
screwed regardless of what we do :x
git-svn-id: https://svn.musicpd.org/mpd/trunk@4491 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to 'src/metadataChunk.c')
-rw-r--r-- | src/metadataChunk.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/metadataChunk.c b/src/metadataChunk.c index 7d57c00af..d11669857 100644 --- a/src/metadataChunk.c +++ b/src/metadataChunk.c @@ -17,13 +17,12 @@ */ #include "metadataChunk.h" +#include "gcc.h" #include <string.h> static void initMetadataChunk(MetadataChunk * chunk) { - memset(chunk, 0, sizeof(MetadataChunk)); - chunk->name = -1; chunk->artist = -1; chunk->album = -1; @@ -54,8 +53,12 @@ MpdTag *metadataChunkToMpdTagDup(MetadataChunk * chunk) if(element < 0 && string && (slen = strlen(string)) && \ pos < METADATA_BUFFER_LENGTH-1) \ { \ - strncpy(chunk->buffer+pos, string, \ - METADATA_BUFFER_LENGTH-1-pos); \ + size_t len = slen; \ + size_t max = METADATA_BUFFER_LENGTH - 1 - pos; \ + if (mpd_unlikely(len > max)) \ + len = max; \ + memcpy(chunk->buffer+pos, string, len); \ + *(chunk->buffer+pos+len) = '\0'; \ element = pos; \ pos += slen+1; \ } \ |