-+ if (strcmp(entry.name, identifier) == 0) {
-+ entry.offset = htonl(entry.offset);
-+ entry.length = htonl(entry.length);
-+ if (entry.length == 0) {
-+ g_warning("Invalid tzdata entry with length zero");
-+ goto error;
-+ }
-+ if (lseek(tzdata_fd, header.data_offset + entry.offset, SEEK_SET) == -1) {
-+ g_warning("Failed seeking to tzdata entry");
-+ goto error;
-+ }
-+ guint8* data = g_malloc(entry.length);
-+ if (read(tzdata_fd, data, entry.length) < entry.length) {
-+ g_warning("Failed reading tzdata entry");
-+ g_free(data);
-+ goto error;
++
++ if (strcmp (entry.name, identifier) == 0)
++ {
++ entry.offset = htonl (entry.offset);
++ entry.length = htonl (entry.length);
++ if (entry.length == 0)
++ {
++ g_warning ("Invalid tzdata entry with length zero");
++ goto error;
++ }
++
++ if (TEMP_FAILURE_RETRY(lseek (tzdata_fd, header.data_offset + entry.offset, SEEK_SET) == -1))
++ {
++ g_warning ("Failed seeking to tzdata entry");
++ goto error;
++ }
++
++ /* Use a reasonable but arbitrary max length of an entry. */
++ if (entry.length > 65536)
++ {
++ g_warning ("Too large tzdata entry length");
++ goto error;
++ }
++
++ guint8* data = g_malloc (entry.length);
++ if (TEMP_FAILURE_RETRY(read (tzdata_fd, data, entry.length) < entry.length))
++ {
++ g_warning ("Failed reading tzdata entry");
++ g_free (data);
++ goto error;
++ }
++
++ close (tzdata_fd);
++ return g_bytes_new_take (data, entry.length);