Merge pull request #580 from mikkeloscar/handle-realloc-fail

swaylock: Handle possible fail on password realloc
This commit is contained in:
Drew DeVault 2016-04-09 18:15:50 -04:00
commit 3b5a8cb40d

View file

@ -113,6 +113,8 @@ bool verify_password() {
void notify_key(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t code, uint32_t codepoint) { void notify_key(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t code, uint32_t codepoint) {
int redraw_screen = 0; int redraw_screen = 0;
char *password_realloc;
if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { if (state == WL_KEYBOARD_KEY_STATE_PRESSED) {
switch (sym) { switch (sym) {
case XKB_KEY_Return: case XKB_KEY_Return:
@ -129,6 +131,7 @@ void notify_key(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t cod
redraw_screen = 1; redraw_screen = 1;
password_size = 1024; password_size = 1024;
free(password);
password = malloc(password_size); password = malloc(password_size);
password[0] = '\0'; password[0] = '\0';
break; break;
@ -149,7 +152,17 @@ void notify_key(enum wl_keyboard_key_state state, xkb_keysym_t sym, uint32_t cod
int i = strlen(password); int i = strlen(password);
if (i + 1 == password_size) { if (i + 1 == password_size) {
password_size += 1024; password_size += 1024;
password = realloc(password, password_size); password_realloc = realloc(password, password_size);
// reset password if realloc fails.
if (password_realloc == NULL) {
password_size = 1024;
free(password);
password = malloc(password_size);
password[0] = '\0';
break;
} else {
password = password_realloc;
}
} }
password[i] = (char)codepoint; password[i] = (char)codepoint;
password[i + 1] = '\0'; password[i + 1] = '\0';