Skip to content

Commit acdbe25

Browse files
Reini Urbancraigberry
authored andcommitted
sdbm.c: fix off-by-one access to global ".dir"
Detected by clang -faddress-sanitizer. The bug came in 081f72a, where we started calculating lengths with sizeof on string constants instead of using strlen. Since string constants include the null byte, sizeof(".dir"), for example, is 5, but we've been copying 6 bytes. This patch resolves [perl #111586] and includes revisions by the committer.
1 parent a752ff7 commit acdbe25

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

ext/SDBM_File/sdbm/sdbm.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ sdbm_open(register char *file, register int flags, register int mode)
7878
register char *dirname;
7979
register char *pagname;
8080
size_t filelen;
81-
const size_t dirfext_len = sizeof(DIRFEXT "");
82-
const size_t pagfext_len = sizeof(PAGFEXT "");
81+
const size_t dirfext_size = sizeof(DIRFEXT "");
82+
const size_t pagfext_size = sizeof(PAGFEXT "");
8383

8484
if (file == NULL || !*file)
8585
return errno = EINVAL, (DBM *) NULL;
@@ -88,17 +88,17 @@ sdbm_open(register char *file, register int flags, register int mode)
8888
*/
8989
filelen = strlen(file);
9090

91-
if ((dirname = (char *) malloc(filelen + dirfext_len + 1
92-
+ filelen + pagfext_len + 1)) == NULL)
91+
if ((dirname = (char *) malloc(filelen + dirfext_size
92+
+ filelen + pagfext_size)) == NULL)
9393
return errno = ENOMEM, (DBM *) NULL;
9494
/*
9595
* build the file names
9696
*/
9797
memcpy(dirname, file, filelen);
98-
memcpy(dirname + filelen, DIRFEXT, dirfext_len + 1);
99-
pagname = dirname + filelen + dirfext_len + 1;
98+
memcpy(dirname + filelen, DIRFEXT, dirfext_size);
99+
pagname = dirname + filelen + dirfext_size;
100100
memcpy(pagname, file, filelen);
101-
memcpy(pagname + filelen, PAGFEXT, pagfext_len + 1);
101+
memcpy(pagname + filelen, PAGFEXT, pagfext_size);
102102

103103
db = sdbm_prep(dirname, pagname, flags, mode);
104104
free((char *) dirname);

0 commit comments

Comments
 (0)