Message ID | 20171212053713.13495-2-nikunj@linux.vnet.ibm.com |
---|---|
State | Accepted |
Headers | show |
Series | [v4,1/2] boot: do not concatenate bootdev | expand |
On 12/12/17 16:37, Nikunj A Dadhania wrote: > The catpad size is 1K size, which can overflow easily with around 20 devices > having bootindex. Replace usage of $cat with a dynamically allocated buffer(16K) > here. Introduce new words to work on the buffer (allocate, free and > concatenate) > > Reported here: https://github.com/qemu/SLOF/issues/3 > > Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> Thanks, applied. > > --- > --- > slof/fs/boot.fs | 41 ++++++++++++++++++++++++++++++++++++++--- > 1 file changed, 38 insertions(+), 3 deletions(-) > > diff --git a/slof/fs/boot.fs b/slof/fs/boot.fs > index 5d41a0e..6d16c54 100644 > --- a/slof/fs/boot.fs > +++ b/slof/fs/boot.fs > @@ -15,8 +15,27 @@ > VARIABLE state-valid false state-valid ! > CREATE go-args 2 cells allot go-args 2 cells erase > > +4000 CONSTANT bootdev-size > +0 VALUE bootdev-buf > + > \ \\\\\\\\\\\\\\ Structure/Implementation Dependent Methods > > +: alloc-bootdev-buf ( -- ) > + bootdev-size alloc-mem ?dup 0= ABORT" Unable to allocate bootdev buffer!" > + dup bootdev-size erase > + to bootdev-buf > +; > + > +: free-bootdev-buf ( -- ) > + bootdev-buf bootdev-size free-mem > + 0 to bootdev-buf > +; > + > +: bootdev-string-cat ( addr1 len1 addr2 len2 -- addr1 len1+len2 ) > + dup 3 pick + bootdev-size > ABORT" bootdev size too big!" > + string-cat > +; > + > : $bootargs > bootargs 2@ ?dup IF > ELSE s" diagnostic-mode?" evaluate and IF s" diag-file" evaluate > @@ -24,14 +43,23 @@ CREATE go-args 2 cells allot go-args 2 cells erase > ; > > : $bootdev ( -- device-name len ) > - bootdevice 2@ dup IF s" " $cat THEN > + alloc-bootdev-buf > + bootdevice 2@ ?dup IF > + swap bootdev-buf 2 pick move > + bootdev-buf swap s" " bootdev-string-cat > + ELSE > + \ use bootdev-buf for concatenating diag mode/boot-device if any > + drop bootdev-buf 0 > + THEN > s" diagnostic-mode?" evaluate IF > s" diag-device" evaluate > ELSE > s" boot-device" evaluate > THEN > - $cat \ prepend bootdevice setting from vpd-bootlist > + ( bootdev len str len1 ) > + bootdev-string-cat \ concatenate both > strdup > + free-bootdev-buf > ?dup 0= IF > disable-watchdog > drop true ABORT" No boot device!" > @@ -51,7 +79,14 @@ CREATE go-args 2 cells allot go-args 2 cells erase > ' (set-boot-device) to set-boot-device > > : (add-boot-device) ( str len -- ) \ Concatenate " str" to "bootdevice" > - bootdevice 2@ ?dup IF $cat-space ELSE drop THEN set-boot-device > + bootdevice 2@ ?dup IF > + alloc-bootdev-buf > + swap bootdev-buf 2 pick move > + bootdev-buf swap s" " bootdev-string-cat > + 2swap bootdev-string-cat > + ELSE drop THEN > + set-boot-device > + bootdev-buf 0 <> IF free-bootdev-buf THEN > ; > > ' (add-boot-device) to add-boot-device >
diff --git a/slof/fs/boot.fs b/slof/fs/boot.fs index 5d41a0e..6d16c54 100644 --- a/slof/fs/boot.fs +++ b/slof/fs/boot.fs @@ -15,8 +15,27 @@ VARIABLE state-valid false state-valid ! CREATE go-args 2 cells allot go-args 2 cells erase +4000 CONSTANT bootdev-size +0 VALUE bootdev-buf + \ \\\\\\\\\\\\\\ Structure/Implementation Dependent Methods +: alloc-bootdev-buf ( -- ) + bootdev-size alloc-mem ?dup 0= ABORT" Unable to allocate bootdev buffer!" + dup bootdev-size erase + to bootdev-buf +; + +: free-bootdev-buf ( -- ) + bootdev-buf bootdev-size free-mem + 0 to bootdev-buf +; + +: bootdev-string-cat ( addr1 len1 addr2 len2 -- addr1 len1+len2 ) + dup 3 pick + bootdev-size > ABORT" bootdev size too big!" + string-cat +; + : $bootargs bootargs 2@ ?dup IF ELSE s" diagnostic-mode?" evaluate and IF s" diag-file" evaluate @@ -24,14 +43,23 @@ CREATE go-args 2 cells allot go-args 2 cells erase ; : $bootdev ( -- device-name len ) - bootdevice 2@ dup IF s" " $cat THEN + alloc-bootdev-buf + bootdevice 2@ ?dup IF + swap bootdev-buf 2 pick move + bootdev-buf swap s" " bootdev-string-cat + ELSE + \ use bootdev-buf for concatenating diag mode/boot-device if any + drop bootdev-buf 0 + THEN s" diagnostic-mode?" evaluate IF s" diag-device" evaluate ELSE s" boot-device" evaluate THEN - $cat \ prepend bootdevice setting from vpd-bootlist + ( bootdev len str len1 ) + bootdev-string-cat \ concatenate both strdup + free-bootdev-buf ?dup 0= IF disable-watchdog drop true ABORT" No boot device!" @@ -51,7 +79,14 @@ CREATE go-args 2 cells allot go-args 2 cells erase ' (set-boot-device) to set-boot-device : (add-boot-device) ( str len -- ) \ Concatenate " str" to "bootdevice" - bootdevice 2@ ?dup IF $cat-space ELSE drop THEN set-boot-device + bootdevice 2@ ?dup IF + alloc-bootdev-buf + swap bootdev-buf 2 pick move + bootdev-buf swap s" " bootdev-string-cat + 2swap bootdev-string-cat + ELSE drop THEN + set-boot-device + bootdev-buf 0 <> IF free-bootdev-buf THEN ; ' (add-boot-device) to add-boot-device
The catpad size is 1K size, which can overflow easily with around 20 devices having bootindex. Replace usage of $cat with a dynamically allocated buffer(16K) here. Introduce new words to work on the buffer (allocate, free and concatenate) Reported here: https://github.com/qemu/SLOF/issues/3 Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> --- --- slof/fs/boot.fs | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-)