diff --git a/src/SDL.c b/src/SDL.c index dfc4572f4..68a4f5da2 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -316,6 +316,8 @@ SDL_InitSubSystem(Uint32 flags) #endif } + (void) flags_initialized; /* make static analysis happy, since this only gets used in error cases. */ + return (0); quit_and_error: diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c index 07eb10147..e49b55068 100644 --- a/src/audio/SDL_wave.c +++ b/src/audio/SDL_wave.c @@ -685,7 +685,7 @@ MS_ADPCM_Decode(WaveFile *file, Uint8 **audio_buf, Uint32 *audio_len) state.output.pos = 0; state.output.size = outputsize / sizeof(Sint16); - state.output.data = (Sint16 *)SDL_malloc(outputsize); + state.output.data = (Sint16 *)SDL_calloc(1, outputsize); if (state.output.data == NULL) { return SDL_OutOfMemory(); } diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 2e88ee714..acf75ac4d 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -384,8 +384,6 @@ SDL_PrivateSendMouseMotion(SDL_Window * window, SDL_MouseID mouseID, int relativ /* Ignore relative motion when first positioning the mouse */ if (!mouse->has_position) { - xrel = 0; - yrel = 0; mouse->x = x; mouse->y = y; mouse->has_position = SDL_TRUE; diff --git a/src/hidapi/mac/hid.c b/src/hidapi/mac/hid.c index a9a85b1f7..ec7ffaf16 100644 --- a/src/hidapi/mac/hid.c +++ b/src/hidapi/mac/hid.c @@ -572,8 +572,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, if ((vendor_id == 0x0 && product_id == 0x0) || (vendor_id == dev_vid && product_id == dev_pid)) { struct hid_device_info *tmp; - size_t len; - + /* VID/PID match. Create the record. */ tmp = (struct hid_device_info *)calloc(1, sizeof(struct hid_device_info)); if (cur_dev) { @@ -590,7 +589,7 @@ struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, /* Fill out the record */ cur_dev->next = NULL; - len = make_path(dev, cbuf, sizeof(cbuf)); + make_path(dev, cbuf, sizeof(cbuf)); cur_dev->path = strdup(cbuf); /* Serial Number */ @@ -817,10 +816,9 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path, int bExclusive) CFSetGetValues(device_set, (const void **) device_array); for (i = 0; i < num_devices; i++) { char cbuf[BUF_LEN]; - size_t len; IOHIDDeviceRef os_dev = device_array[i]; - len = make_path(os_dev, cbuf, sizeof(cbuf)); + make_path(os_dev, cbuf, sizeof(cbuf)); if (!strcmp(cbuf, path)) { // Matched Paths. Open this Device. IOReturn ret = IOHIDDeviceOpen(os_dev, kIOHIDOptionsTypeNone); @@ -833,6 +831,7 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path, int bExclusive) /* Create the buffers for receiving data */ dev->max_input_report_len = (CFIndex) get_max_report_length(os_dev); + SDL_assert(dev->max_input_report_len > 0); dev->input_report_buf = (uint8_t *)calloc(dev->max_input_report_len, sizeof(uint8_t)); /* Create the Run Loop Mode for this device. @@ -936,11 +935,14 @@ static int return_data(hid_device *dev, unsigned char *data, size_t length) /* Copy the data out of the linked list item (rpt) into the return buffer (data), and delete the liked list item. */ struct input_report *rpt = dev->input_reports; - size_t len = (length < rpt->len)? length: rpt->len; - memcpy(data, rpt->data, len); - dev->input_reports = rpt->next; - free(rpt->data); - free(rpt); + size_t len = 0; + if (rpt != NULL) { + len = (length < rpt->len)? length: rpt->len; + memcpy(data, rpt->data, len); + dev->input_reports = rpt->next; + free(rpt->data); + free(rpt); + } return (int)len; } diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c index 3f3482b7d..70e19acbe 100644 --- a/src/joystick/SDL_joystick.c +++ b/src/joystick/SDL_joystick.c @@ -1590,11 +1590,13 @@ SDL_JoystickUpdate(void) for (joystick = SDL_joysticks; joystick; joystick = joystick->next) { if (joystick->attached) { - /* This should always be true, but seeing a crash in the wild...? */ - if (joystick->driver) { - joystick->driver->Update(joystick); + /* This driver should always be != NULL, but seeing a crash in the wild...? */ + if (!joystick->driver) { + continue; /* nothing we can do, and other things use joystick->driver below here. */ } + joystick->driver->Update(joystick); + if (joystick->delayed_guide_button) { SDL_GameControllerHandleDelayedGuideButton(joystick); } diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c index 55d9a1353..f54b3c3f2 100644 --- a/src/joystick/hidapi/SDL_hidapijoystick.c +++ b/src/joystick/hidapi/SDL_hidapijoystick.c @@ -227,7 +227,7 @@ HIDAPI_CleanupDeviceDriver(SDL_HIDAPI_Device *device) } /* Disconnect any joysticks */ - while (device->num_joysticks) { + while (device->num_joysticks && device->joysticks) { HIDAPI_JoystickDisconnected(device, device->joysticks[0]); } diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index c5f683405..30fee886e 100644 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -3145,10 +3145,11 @@ SDL_RenderDrawLinesF(SDL_Renderer * renderer, num_vertices, indices, num_indices, size_indices, 1.0f, 1.0f); - SDL_small_free(xy, isstack1); - SDL_small_free(indices, isstack2); } + SDL_small_free(xy, isstack1); + SDL_small_free(indices, isstack2); + } else if (renderer->scale.x != 1.0f || renderer->scale.y != 1.0f) { retval = RenderDrawLinesWithRectsF(renderer, points, count); } else { diff --git a/src/video/SDL_bmp.c b/src/video/SDL_bmp.c index 0987f5435..03b3e2f48 100644 --- a/src/video/SDL_bmp.c +++ b/src/video/SDL_bmp.c @@ -394,6 +394,12 @@ SDL_LoadBMP_RW(SDL_RWops * src, int freesrc) break; } + if (biBitCount >= 32) { /* we shift biClrUsed by this value later. */ + SDL_SetError("Unsupported or incorrect biBitCount field"); + was_error = SDL_TRUE; + goto done; + } + /* Create a compatible surface, note that the colors are RGB ordered */ surface = SDL_CreateRGBSurface(0, biWidth, biHeight, biBitCount, Rmask, Gmask, diff --git a/src/video/SDL_egl.c b/src/video/SDL_egl.c index c9fb476b0..924b3fd44 100644 --- a/src/video/SDL_egl.c +++ b/src/video/SDL_egl.c @@ -530,7 +530,7 @@ SDL_EGL_LoadLibrary(_THIS, const char *egl_path, NativeDisplayType native_displa } #endif /* Try the implementation-specific eglGetDisplay even if eglGetPlatformDisplay fails */ - if (_this->egl_data->egl_display == EGL_NO_DISPLAY) { + if ((_this->egl_data->egl_display == EGL_NO_DISPLAY) && (_this->egl_data->eglGetDisplay != NULL)) { _this->egl_data->egl_display = _this->egl_data->eglGetDisplay(native_display); } if (_this->egl_data->egl_display == EGL_NO_DISPLAY) { diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 3be98806d..f2c7b8b23 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -261,6 +261,7 @@ SDL_CreateWindowTexture(SDL_VideoDevice *_this, SDL_Window * window, Uint32 * fo SDL_TEXTUREACCESS_STREAMING, window->w, window->h); if (!data->texture) { + /* codechecker_false_positive [Malloc] Static analyzer doesn't realize allocated `data` is saved to SDL_WINDOWTEXTUREDATA and not leaked here. */ return -1; } @@ -1184,6 +1185,7 @@ SDL_GetWindowDisplayMode(SDL_Window * window, SDL_DisplayMode * mode) } else if (!SDL_GetClosestDisplayModeForDisplay(SDL_GetDisplayForWindow(window), &fullscreen_mode, &fullscreen_mode)) { + SDL_zerop(mode); return SDL_SetError("Couldn't find display mode match"); }