Index: uspace/app/mkexfat/mkexfat.c
===================================================================
--- uspace/app/mkexfat/mkexfat.c	(revision 89a0a827d707204d79cea7eba87c1cb5bdbd23b9)
+++ uspace/app/mkexfat/mkexfat.c	(revision 552efe3a26a6b78c9b269466a95be52cd90f4b24)
@@ -77,4 +77,6 @@
 /** Index of the first free cluster on the device */
 #define FIRST_FREE_CLUSTER   2
+
+#define min(x, y) ((x) < (y) ? (x) : (y))
 
 typedef struct exfat_cfg {
@@ -474,10 +476,16 @@
 upcase_table_write(service_id_t service_id, exfat_cfg_t *cfg)
 {
-	int rc;
+	int rc = EOK;
 	aoff64_t start_sec, nsecs, i;
 	uint8_t *table_ptr;
+	uint8_t *buf;
+	size_t table_size = sizeof(upcase_table);
+
+	buf = malloc(cfg->sector_size);
+	if (!buf)
+		return ENOENT;
 
 	start_sec = cfg->data_start_sector;
-	start_sec += (cfg->upcase_table_cluster * cfg->cluster_size) /
+	start_sec += ((cfg->upcase_table_cluster - 2) * cfg->cluster_size) /
 	    cfg->sector_size;
 
@@ -485,12 +493,20 @@
 	table_ptr = (uint8_t *) upcase_table;
 
-	for (i = 0; i < nsecs; ++i, table_ptr += cfg->sector_size) {
+	for (i = 0; i < nsecs; ++i,
+	    table_ptr += min(table_size, cfg->sector_size),
+	    table_size -= cfg->sector_size) {
+
+		if (table_size < cfg->sector_size)
+			memset(buf, 0, cfg->sector_size);
+		memcpy(buf, table_ptr, min(table_size, cfg->sector_size));
+
 		rc = block_write_direct(service_id,
-		    start_sec + i, 1, table_ptr);
+		    start_sec + i, 1, buf);
 		if (rc != EOK)
-			return rc;
-	}
-
-	return EOK;
+			break;
+	}
+
+	free(buf);
+	return rc;
 }
 
