sh: Fix some arithmetic undefined behaviour.

Fix shifts of possibly negative numbers found with ubsan and avoid signed
integer overflow when hashing an extremely long command name.

MFC after:	1 week
This commit is contained in:
Jilles Tjoelker 2015-06-24 20:51:48 +00:00
parent a5b789f65a
commit c3c85727d0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=284779
2 changed files with 3 additions and 4 deletions

View File

@ -248,7 +248,7 @@ hashalias(const char *p)
{
unsigned int hashval;
hashval = *p << 4;
hashval = (unsigned char)*p << 4;
while (*p)
hashval+= *p++;
return &atab[hashval % ATABSIZE];

View File

@ -522,17 +522,16 @@ static struct tblentry **lastcmdentry;
static struct tblentry *
cmdlookup(const char *name, int add)
{
int hashval;
unsigned int hashval;
const char *p;
struct tblentry *cmdp;
struct tblentry **pp;
size_t len;
p = name;
hashval = *p << 4;
hashval = (unsigned char)*p << 4;
while (*p)
hashval += *p++;
hashval &= 0x7FFF;
pp = &cmdtable[hashval % CMDTABLESIZE];
for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) {
if (equal(cmdp->cmdname, name))