Message ID | A877377E-4C68-4090-B21E-7D5BE41261EB@suse.de |
---|---|
State | New |
Headers | show |
On 14/02/13 00:17, Alexander Graf wrote: > With the following patch fixing the issue at hand for me. Though I don't fully understand why str would be NULL yet: > > > diff --git a/packages/mac-parts.c b/packages/mac-parts.c > index a286870..443455e 100644 > --- a/packages/mac-parts.c > +++ b/packages/mac-parts.c > @@ -140,7 +140,7 @@ macparts_open( macparts_info_t *di ) > * Implement partition selection as per the PowerPC Microprocessor CHRP bindings > */ > > - if (parnum == 0) { > + if (str == NULL || parnum == 0) { > /* According to the spec, partition 0 as well as no arguments means the whole disk */ > offs = (long long)0; > size = (long long)__be32_to_cpu(dmap.sbBlkCount) * bs; > > Alex Ah okay. It's actually caused by this bit of logic in libopenbios/bindings.c and assuming that my_args() is a zero length Forth string: char * pop_fstr_copy( void ) { int len = POP(); char *str, *p = (char*)cell2pointer(POP()); if( !len ) return NULL; str = malloc( len + 1 ); if( !str ) return NULL; memcpy( str, p, len ); str[len] = 0; return str; } The check for a zero length string and returning NULL has caused me problems before when round-tripping strings between Forth and C. Without testing the patch myself, I'd say that it looks good. I can run it over my complete set of test images tomorrow evening if that would be acceptable? Can you post a git diff version to the OpenBIOS mailing list too? ATB, Mark.
On 14.02.2013, at 01:54, Mark Cave-Ayland wrote: > On 14/02/13 00:17, Alexander Graf wrote: > >> With the following patch fixing the issue at hand for me. Though I don't fully understand why str would be NULL yet: >> >> >> diff --git a/packages/mac-parts.c b/packages/mac-parts.c >> index a286870..443455e 100644 >> --- a/packages/mac-parts.c >> +++ b/packages/mac-parts.c >> @@ -140,7 +140,7 @@ macparts_open( macparts_info_t *di ) >> * Implement partition selection as per the PowerPC Microprocessor CHRP bindings >> */ >> >> - if (parnum == 0) { >> + if (str == NULL || parnum == 0) { >> /* According to the spec, partition 0 as well as no arguments means the whole disk */ >> offs = (long long)0; >> size = (long long)__be32_to_cpu(dmap.sbBlkCount) * bs; >> >> Alex > > Ah okay. It's actually caused by this bit of logic in libopenbios/bindings.c and assuming that my_args() is a zero length Forth string: > > char * > pop_fstr_copy( void ) > { > int len = POP(); > char *str, *p = (char*)cell2pointer(POP()); > if( !len ) > return NULL; > str = malloc( len + 1 ); > if( !str ) > return NULL; > memcpy( str, p, len ); > str[len] = 0; > return str; > } > > The check for a zero length string and returning NULL has caused me problems before when round-tripping strings between Forth and C. > > Without testing the patch myself, I'd say that it looks good. I can run it over my complete set of test images tomorrow evening if that would be acceptable? Either we get the fix in in the next few hours (and thus agree that it's the right way forward) or there's no rush - QEMU 1.5 is quite a while to go. > Can you post a git diff version to the OpenBIOS mailing list too? Sure! Alex
diff --git a/packages/mac-parts.c b/packages/mac-parts.c index a286870..443455e 100644 --- a/packages/mac-parts.c +++ b/packages/mac-parts.c @@ -140,7 +140,7 @@ macparts_open( macparts_info_t *di ) * Implement partition selection as per the PowerPC Microprocessor CHRP bindings */ - if (parnum == 0) { + if (str == NULL || parnum == 0) { /* According to the spec, partition 0 as well as no arguments means the whole disk */ offs = (long long)0; size = (long long)__be32_to_cpu(dmap.sbBlkCount) * bs;