Hi Gabriel, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on staging/staging-testing] [also build test WARNING on v4.17-rc7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Gabriel-Fedel/staging-speakup-remove-simple_strtoul/20180528-231304 coccinelle warnings: (new ones prefixed by >>) >> drivers/staging/speakup/kobjects.c:163:2-5: alloc with no test, possible model on line 146 drivers/staging/speakup/kobjects.c:163:2-5: alloc with no test, possible model on line 185 drivers/staging/speakup/kobjects.c:809:2-5: alloc with no test, possible model on line 791 vim +163 drivers/staging/speakup/kobjects.c 105 106 /* 107 * This is called when a user changes the characters or chartab parameters. 108 */ 109 static ssize_t chars_chartab_store(struct kobject *kobj, 110 struct kobj_attribute *attr, 111 const char *buf, size_t count) 112 { 113 char *cp = (char *)buf; 114 char *end = cp + count; /* the null at the end of the buffer */ 115 char *linefeed = NULL; 116 char keyword[MAX_DESC_LEN + 1]; 117 char *outptr = NULL; /* Will hold keyword or desc. */ 118 char *temp = NULL; 119 char *desc = NULL; 120 char *num = NULL; /* The number part of cp */ 121 ssize_t retval = count; 122 unsigned long flags; 123 unsigned long index = 0; 124 int charclass = 0; 125 int received = 0; 126 int used = 0; 127 int rejected = 0; 128 int reset = 0; 129 int do_characters = !strcmp(attr->attr.name, "characters"); 130 size_t desc_length = 0; 131 int i; 132 133 spin_lock_irqsave(&speakup_info.spinlock, flags); 134 while (cp < end) { 135 while ((cp < end) && (*cp == ' ' || *cp == '\t')) 136 cp++; 137 138 if (cp == end) 139 break; 140 if ((*cp == '\n') || strchr("dDrR", *cp)) { 141 reset = 1; 142 break; 143 } 144 received++; 145 > 146 linefeed = strchr(cp, '\n'); 147 if (!linefeed) { 148 rejected++; 149 break; 150 } 151 152 if (!isdigit(*cp)) { 153 rejected++; 154 cp = linefeed + 1; 155 continue; 156 } 157 158 i = 0; 159 while (isdigit(*(cp + i))) 160 i = i + 1; 161 temp = cp + i; 162 > 163 num = kmalloc(i + 2, GFP_ATOMIC); 164 strscpy(num, cp, i + 1); 165 166 if (kstrtoul(num, 10, &index) != 0) 167 pr_warn("overflow or parsing error has occurred"); 168 169 if (index > 255) { 170 rejected++; 171 cp = linefeed + 1; 172 continue; 173 } 174 175 while ((temp < linefeed) && (*temp == ' ' || *temp == '\t')) 176 temp++; 177 178 desc_length = linefeed - temp; 179 if (desc_length > MAX_DESC_LEN) { 180 rejected++; 181 cp = linefeed + 1; 182 continue; 183 } 184 if (do_characters) { 185 desc = kmalloc(desc_length + 1, GFP_ATOMIC); 186 if (!desc) { 187 retval = -ENOMEM; 188 reset = 1; /* just reset on error. */ 189 break; 190 } 191 outptr = desc; 192 } else { 193 outptr = keyword; 194 } 195 196 for (i = 0; i < desc_length; i++) 197 outptr[i] = temp[i]; 198 outptr[desc_length] = '\0'; 199 200 if (do_characters) { 201 if (spk_characters[index] != spk_default_chars[index]) 202 kfree(spk_characters[index]); 203 spk_characters[index] = desc; 204 used++; 205 } else { 206 charclass = spk_chartab_get_value(keyword); 207 if (charclass == 0) { 208 rejected++; 209 cp = linefeed + 1; 210 continue; 211 } 212 if (charclass != spk_chartab[index]) { 213 spk_chartab[index] = charclass; 214 used++; 215 } 216 } 217 cp = linefeed + 1; 218 } 219 220 if (reset) { 221 if (do_characters) 222 spk_reset_default_chars(); 223 else 224 spk_reset_default_chartab(); 225 } 226 227 spin_unlock_irqrestore(&speakup_info.spinlock, flags); 228 report_char_chartab_status(reset, received, used, rejected, 229 do_characters); 230 return retval; 231 } 232 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel