drm/msm/adreno: Remove VLA usage
Subsystems (5)
PATCH 1/1 drm/msm/adreno: Remove VLA usage
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 7 +++++-- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 28 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-)
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +5 -2
@@ -11,6 +11,7 @@* */ +#include <linux/kernel.h> #include <linux/types.h> #include <linux/cpumask.h> #include <linux/qcom_scm.h>
@@ -19,6 +20,7 @@#include <linux/soc/qcom/mdt_loader.h> #include <linux/pm_opp.h> #include <linux/nvmem-consumer.h> +#include <linux/slab.h> #include "msm_gem.h" #include "msm_mmu.h" #include "a5xx_gpu.h"
@@ -91,12 +93,13 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname) ret =qcom_mdt_load (dev, fw, fwname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL ); }else { -char newname[strlen ("qcom/" ) +strlen (fwname) +1 ]; +char *newname; -sprintf (newname,"qcom/%s" , fwname); + newname =kasprintf (GFP_KERNEL ,"qcom/%s" , fwname); ret =qcom_mdt_load (dev, fw, newname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL ); +kfree (newname); }if (ret) goto out;
drivers/gpu/drm/msm/adreno/adreno_gpu.c +19 -9
@@ -17,7 +17,9 @@* this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <linux/kernel.h> #include <linux/pm_opp.h> +#include <linux/slab.h> #include "adreno_gpu.h" #include "msm_gem.h" #include "msm_mmu.h"
@@ -70,10 +72,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname) {struct drm_device *drm = adreno_gpu->base.dev;const struct firmware *fw =NULL ; -char newname[strlen ("qcom/" ) +strlen (fwname) +1 ]; +char *newname;int ret; -sprintf (newname,"qcom/%s" , fwname); + newname =kasprintf (GFP_KERNEL ,"qcom/%s" , fwname); +if (!newname) +return ERR_PTR (-ENOMEM );/* * Try first to load from qcom/$fwfile using a direct load (to avoid
@@ -87,11 +91,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s from new location\n" , newname); adreno_gpu->fwloc =FW_LOCATION_NEW ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , newname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }
@@ -106,11 +111,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s from legacy location\n" , newname); adreno_gpu->fwloc =FW_LOCATION_LEGACY ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , fwname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }
@@ -126,16 +132,20 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s with helper\n" , newname); adreno_gpu->fwloc =FW_LOCATION_HELPER ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , newname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }dev_err (drm->dev,"failed to load %s\n" , fwname); -return ERR_PTR (-ENOENT ); + fw =ERR_PTR (-ENOENT ); +out: +kfree (newname); +return fw; }static int adreno_load_fw (struct adreno_gpu *adreno_gpu)
Signature · 6 lines
2.17.1 -- Kees Cook Pixel Security
Quoted 11 lines · Kees Cook
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Signed-off-by Kees Cook <[email protected]>--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 7 +++++-- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 28 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-)
This seems fine, though using a fixed-length string is probably just as well here,
given that the 'fwname' variable is always set to the constant string "a530_zap.mdt"
at the moment, which is not very long.
Arnd
_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno
Quoted 13 lines · Arnd Bergmann
Quoted 11 lines · Kees Cook
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Signed-off-by Kees Cook <[email protected]>--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 7 +++++-- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 28 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-)
Quoted 5 lines
This seems fine, though using a fixed-length string is probably just as well here,
given that the 'fwname' variable is always set to the constant string "a530_zap.mdt"
at the moment, which is not very long.
We could make it fixed but since this code is only called once this feels safer.
Jordan
Signature · 6 lines
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Quoted 5 lines · Kees Cook
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Thanks for doing this.
Quoted 132 lines
Signed-off-by Kees Cook <[email protected]>--- drivers/gpu/drm/msm/adreno/a5xx_gpu.c | 7 +++++-- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 28 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 11 deletions(-)drivers/gpu/drm/msm/adreno/a5xx_gpu.c +5
-2@@ -11,6 +11,7 @@* */ +#include <linux/kernel.h> #include <linux/types.h> #include <linux/cpumask.h> #include <linux/qcom_scm.h> @@ -19,6 +20,7 @@#include <linux/soc/qcom/mdt_loader.h> #include <linux/pm_opp.h> #include <linux/nvmem-consumer.h> +#include <linux/slab.h> #include "msm_gem.h" #include "msm_mmu.h" #include "a5xx_gpu.h" @@ -91,12 +93,13 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname) ret =qcom_mdt_load (dev, fw, fwname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL ); }else { -char newname[strlen ("qcom/" ) +strlen (fwname) +1 ]; +char *newname; -sprintf (newname,"qcom/%s" , fwname); + newname =kasprintf (GFP_KERNEL ,"qcom/%s" , fwname); ret =qcom_mdt_load (dev, fw, newname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL ); +kfree (newname); }if (ret) goto out;drivers/gpu/drm/msm/adreno/adreno_gpu.c +19
-9@@ -17,7 +17,9 @@* this program. If not, see <http://www.gnu.org/licenses/>. */ +#include <linux/kernel.h> #include <linux/pm_opp.h> +#include <linux/slab.h> #include "adreno_gpu.h" #include "msm_gem.h" #include "msm_mmu.h" @@ -70,10 +72,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname) {struct drm_device *drm = adreno_gpu->base.dev;const struct firmware *fw =NULL ; -char newname[strlen ("qcom/" ) +strlen (fwname) +1 ]; +char *newname;int ret; -sprintf (newname,"qcom/%s" , fwname); + newname =kasprintf (GFP_KERNEL ,"qcom/%s" , fwname); +if (!newname) +return ERR_PTR (-ENOMEM );/* * Try first to load from qcom/$fwfile using a direct load (to avoid @@ -87,11 +91,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s from new location\n" , newname); adreno_gpu->fwloc =FW_LOCATION_NEW ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , newname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }@@ -106,11 +111,12 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s from legacy location\n" , newname); adreno_gpu->fwloc =FW_LOCATION_LEGACY ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , fwname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }@@ -126,16 +132,20 @@ adreno_request_fw(struct adreno_gpu *adreno_gpu, const char *fwname)dev_info (drm->dev,"loaded %s with helper\n" , newname); adreno_gpu->fwloc =FW_LOCATION_HELPER ; -return fw; + goto out; }else if (adreno_gpu->fwloc !=FW_LOCATION_UNKNOWN ) {dev_err (drm->dev,"failed to load %s: %d\n" , newname, ret); -return ERR_PTR (ret); + fw =ERR_PTR (ret); + goto out; } }dev_err (drm->dev,"failed to load %s\n" , fwname); -return ERR_PTR (-ENOENT ); + fw =ERR_PTR (-ENOENT ); +out: +kfree (newname); +return fw; }static int adreno_load_fw (struct adreno_gpu *adreno_gpu)Signature · 6 lines
2.17.1 -- Kees Cook Pixel Security
Signature · 6 lines
The Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Quoted 10 lines · Jordan Crouse
Quoted 5 lines · Kees Cook
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Thanks for doing this.
Acked-by Jordan Crouse <[email protected]>
Hi Rob,
Is this something you can take via your tree?
Thanks,
-Kees
Signature · 6 lines
Kees Cook Pixel Security _______________________________________________ Freedreno mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/freedreno
Quoted 8 lines · Kees Cook
Quoted 7 lines · Jordan Crouse
Quoted 5 lines · Kees Cook
In the quest to remove all stack VLA usage from the kernel[1], this switches to using a kasprintf()ed buffer. Return paths are updated to free the allocation.
[1] https://lkml.kernel.org/r/CA+55aFzCG-zNmZwX4A2FQpadafLfEzK6CC=qPXydAacU1RqZWA@mail.gmail.com
Quoted 8 lines
Quoted 3 lines
Thanks for doing this.
Acked-by Jordan Crouse <[email protected]>Hi Rob,
Is this something you can take via your tree?
Oh, sorry, I missed this one, I'll pick it up shortly..
BR,
-R
_______________________________________________
Freedreno mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/freedreno
drivers/gpu/drm/msm/adreno/a5xx_gpu.c static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname) · line 101
Quoted 12 lines
drivers/gpu/drm/msm/adreno/a5xx_gpu.c +2
-2@@ -91,12 +93,13 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname) ret =qcom_mdt_load (dev, fw, fwname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL ); }else { -char newname[strlen ("qcom/" ) +strlen (fwname) +1 ]; +char *newname; -sprintf (newname,"qcom/%s" , fwname); + newname =kasprintf (GFP_KERNEL ,"qcom/%s" , fwname); ret =qcom_mdt_load (dev, fw, newname,GPU_PAS_ID , mem_region, mem_phys, mem_size,NULL );
I have taken another look also at this update suggestion.
Now I wonder why the return value is not checked for the added name construction in the way as it is specified for the function “adreno_request_fw”. Will another condition check make sense at this place?
Regards,
Markus