Commit 182fe5abd8ebbb3a00c1be91f44e4783e139918c

Authored by Cyrill Gorcunov
Committed by Steven Whitehouse
1 parent 105284970b

[GFS2] possible null pointer dereference fixup

gfs2_alloc_get may fail so we have to check it to prevent
NULL pointer dereference.

Signed-off-by: Cyrill Gorcunov <gorcunov@gamil.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>

Showing 7 changed files with 44 additions and 8 deletions Side-by-side Diff

... ... @@ -900,6 +900,8 @@
900 900 int error;
901 901  
902 902 al = gfs2_alloc_get(ip);
  903 + if (!al)
  904 + return -ENOMEM;
903 905  
904 906 error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
905 907 if (error)
... ... @@ -1081,7 +1083,8 @@
1081 1083 lblock = (size - 1) >> sdp->sd_sb.sb_bsize_shift;
1082 1084  
1083 1085 find_metapath(sdp, lblock, &mp, ip->i_height);
1084   - gfs2_alloc_get(ip);
  1086 + if (!gfs2_alloc_get(ip))
  1087 + return -ENOMEM;
1085 1088  
1086 1089 error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
1087 1090 if (error)
... ... @@ -1868,11 +1868,14 @@
1868 1868 if (!ht)
1869 1869 return -ENOMEM;
1870 1870  
1871   - gfs2_alloc_get(dip);
  1871 + if (!gfs2_alloc_get(dip)) {
  1872 + error = -ENOMEM;
  1873 + goto out;
  1874 + }
1872 1875  
1873 1876 error = gfs2_quota_hold(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
1874 1877 if (error)
1875   - goto out;
  1878 + goto out_put;
1876 1879  
1877 1880 error = gfs2_rindex_hold(sdp, &dip->i_alloc->al_ri_gh);
1878 1881 if (error)
1879 1882  
... ... @@ -1946,8 +1949,9 @@
1946 1949 gfs2_glock_dq_uninit(&dip->i_alloc->al_ri_gh);
1947 1950 out_qs:
1948 1951 gfs2_quota_unhold(dip);
1949   -out:
  1952 +out_put:
1950 1953 gfs2_alloc_put(dip);
  1954 +out:
1951 1955 kfree(ht);
1952 1956 return error;
1953 1957 }
... ... @@ -318,6 +318,8 @@
318 318 int error;
319 319  
320 320 al = gfs2_alloc_get(ip);
  321 + if (!al)
  322 + return -ENOMEM;
321 323  
322 324 error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
323 325 if (error)
... ... @@ -681,6 +683,8 @@
681 683 int error;
682 684  
683 685 al = gfs2_alloc_get(ip);
  686 + if (!al)
  687 + return -ENOMEM;
684 688  
685 689 error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
686 690 if (error)
... ... @@ -1464,6 +1468,8 @@
1464 1468 int error;
1465 1469  
1466 1470 al = gfs2_alloc_get(ip);
  1471 + if (!al)
  1472 + return -ENOMEM;
1467 1473  
1468 1474 error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
1469 1475 if (error)
... ... @@ -351,6 +351,8 @@
351 351 }
352 352  
353 353 al = gfs2_alloc_get(ip);
  354 + if (!al)
  355 + return -ENOMEM;
354 356  
355 357 error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
356 358 if (error)
... ... @@ -825,7 +827,8 @@
825 827 int error;
826 828  
827 829 munge_mode_uid_gid(dip, &mode, &uid, &gid);
828   - gfs2_alloc_get(dip);
  830 + if (!gfs2_alloc_get(dip))
  831 + return -ENOMEM;
829 832  
830 833 error = gfs2_quota_lock(dip, uid, gid);
831 834 if (error)
... ... @@ -860,6 +863,8 @@
860 863 int error;
861 864  
862 865 al = gfs2_alloc_get(dip);
  866 + if (!al)
  867 + return -ENOMEM;
863 868  
864 869 error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
865 870 if (error)
fs/gfs2/ops_address.c
... ... @@ -649,6 +649,10 @@
649 649  
650 650 if (alloc_required) {
651 651 al = gfs2_alloc_get(ip);
  652 + if (!al) {
  653 + error = -ENOMEM;
  654 + goto out_unlock;
  655 + }
652 656  
653 657 error = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
654 658 if (error)
... ... @@ -200,6 +200,10 @@
200 200  
201 201 if (alloc_required) {
202 202 struct gfs2_alloc *al = gfs2_alloc_get(dip);
  203 + if (!al) {
  204 + error = -ENOMEM;
  205 + goto out_gunlock;
  206 + }
203 207  
204 208 error = gfs2_quota_lock(dip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
205 209 if (error)
... ... @@ -716,6 +720,10 @@
716 720  
717 721 if (alloc_required) {
718 722 struct gfs2_alloc *al = gfs2_alloc_get(ndip);
  723 + if (!al) {
  724 + error = -ENOMEM;
  725 + goto out_gunlock;
  726 + }
719 727  
720 728 error = gfs2_quota_lock(ndip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
721 729 if (error)
... ... @@ -953,7 +961,8 @@
953 961 if (!(attr->ia_valid & ATTR_GID) || ogid == ngid)
954 962 ogid = ngid = NO_QUOTA_CHANGE;
955 963  
956   - gfs2_alloc_get(ip);
  964 + if (!gfs2_alloc_get(ip))
  965 + return -ENOMEM;
957 966  
958 967 error = gfs2_quota_lock(ip, nuid, ngid);
959 968 if (error)
... ... @@ -617,8 +617,9 @@
617 617 int err = -EIO;
618 618  
619 619 if (gfs2_is_stuffed(ip)) {
620   - struct gfs2_alloc *al = NULL;
621   - al = gfs2_alloc_get(ip);
  620 + struct gfs2_alloc *al = gfs2_alloc_get(ip);
  621 + if (!al)
  622 + return -ENOMEM;
622 623 /* just request 1 blk */
623 624 al->al_requested = 1;
624 625 gfs2_inplace_reserve(ip);
... ... @@ -729,6 +730,10 @@
729 730  
730 731 if (nalloc) {
731 732 al = gfs2_alloc_get(ip);
  733 + if (!al) {
  734 + error = -ENOMEM;
  735 + goto out_gunlock;
  736 + }
732 737  
733 738 al->al_requested = nalloc * (data_blocks + ind_blocks);
734 739