Fix pointer bug in drop_volume_label_suffix
Problem reported by Marc Espie in: https://lists.gnu.org/r/bug-tar/2023-09/msg00003.html * src/buffer.c (drop_volume_label_suffix): Redo to not compute a pointer before the start of a buffer, as this is not portable.
This commit is contained in:
1
THANKS
1
THANKS
@@ -327,6 +327,7 @@ Mads Martin Joergensen mmj@suse.de
|
|||||||
Manfred Weichel Manfred.Weichel@mch.sni.de
|
Manfred Weichel Manfred.Weichel@mch.sni.de
|
||||||
Manuel Munier Manuel.Munier@loria.fr
|
Manuel Munier Manuel.Munier@loria.fr
|
||||||
Marc Boucher marc@cam.org
|
Marc Boucher marc@cam.org
|
||||||
|
Marc Espie marc.espie.openbsd@gmail.com
|
||||||
Marc Ewing marc@redhat.com
|
Marc Ewing marc@redhat.com
|
||||||
Marcin Matuszewski marcin@frodo.nask.org.pl
|
Marcin Matuszewski marcin@frodo.nask.org.pl
|
||||||
Marcus Daniels marcus@sysc.pdx.edu
|
Marcus Daniels marcus@sysc.pdx.edu
|
||||||
|
|||||||
32
src/buffer.c
32
src/buffer.c
@@ -1565,33 +1565,21 @@ try_new_volume (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define VOLUME_TEXT " Volume "
|
|
||||||
#define VOLUME_TEXT_LEN (sizeof VOLUME_TEXT - 1)
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
drop_volume_label_suffix (const char *label)
|
drop_volume_label_suffix (const char *label)
|
||||||
{
|
{
|
||||||
const char *p;
|
static char const VOLUME_TEXT[] = " Volume ";
|
||||||
size_t len = strlen (label);
|
idx_t VOLUME_TEXT_LEN = sizeof VOLUME_TEXT - 1;
|
||||||
|
idx_t prefix_len = 0;
|
||||||
|
|
||||||
if (len < 1)
|
for (idx_t i = 0; label[i]; i++)
|
||||||
return NULL;
|
if (!isdigit ((unsigned char) label[i]))
|
||||||
|
prefix_len = i + 1;
|
||||||
|
|
||||||
for (p = label + len - 1; p > label && isdigit ((unsigned char) *p); p--)
|
ptrdiff_t len = prefix_len - VOLUME_TEXT_LEN;
|
||||||
;
|
return (0 <= len && memcmp (label + len, VOLUME_TEXT, VOLUME_TEXT_LEN) == 0
|
||||||
if (p > label && p - (VOLUME_TEXT_LEN - 1) > label)
|
? ximemdup0 (label, len)
|
||||||
{
|
: NULL);
|
||||||
p -= VOLUME_TEXT_LEN - 1;
|
|
||||||
if (memcmp (p, VOLUME_TEXT, VOLUME_TEXT_LEN) == 0)
|
|
||||||
{
|
|
||||||
char *s = xmalloc ((len = p - label) + 1);
|
|
||||||
memcpy (s, label, len);
|
|
||||||
s[len] = 0;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check LABEL against the volume label, seen as a globbing
|
/* Check LABEL against the volume label, seen as a globbing
|
||||||
|
|||||||
@@ -460,7 +460,8 @@ extern uintmax_t continued_file_size;
|
|||||||
extern uintmax_t continued_file_offset;
|
extern uintmax_t continued_file_offset;
|
||||||
extern off_t records_written;
|
extern off_t records_written;
|
||||||
|
|
||||||
char *drop_volume_label_suffix (const char *label);
|
char *drop_volume_label_suffix (const char *label)
|
||||||
|
_GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_DEALLOC_FREE;
|
||||||
|
|
||||||
size_t available_space_after (union block *pointer);
|
size_t available_space_after (union block *pointer);
|
||||||
off_t current_block_ordinal (void);
|
off_t current_block_ordinal (void);
|
||||||
|
|||||||
Reference in New Issue
Block a user