]> granicus.if.org Git - postgresql/commitdiff
In pg_upgrade, properly handle oids > 2^31 by using strtoul() internally
authorBruce Momjian <bruce@momjian.us>
Tue, 28 Sep 2010 21:41:03 +0000 (21:41 +0000)
committerBruce Momjian <bruce@momjian.us>
Tue, 28 Sep 2010 21:41:03 +0000 (21:41 +0000)
rather than atol().

Per report from Brian Hirt

contrib/pg_upgrade/controldata.c
contrib/pg_upgrade/info.c
contrib/pg_upgrade/pg_upgrade.h
contrib/pg_upgrade/relfilenode.c
contrib/pg_upgrade/util.c

index f36c2c179db1b6ccebe5ca2d9b861315e975a64d..c0fe821a0b9fc62962c965deac2c4325439ea472 100644 (file)
@@ -155,7 +155,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: pg_resetxlog problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.ctrl_ver = (uint32) atol(p);
+                       cluster->controldata.ctrl_ver = str2uint(p);
                }
                else if ((p = strstr(bufin, "Catalog version number:")) != NULL)
                {
@@ -165,7 +165,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.cat_ver = (uint32) atol(p);
+                       cluster->controldata.cat_ver = str2uint(p);
                }
                else if ((p = strstr(bufin, "First log file ID after reset:")) != NULL)
                {
@@ -175,7 +175,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.logid = (uint32) atol(p);
+                       cluster->controldata.logid = str2uint(p);
                        got_log_id = true;
                }
                else if ((p = strstr(bufin, "First log file segment after reset:")) != NULL)
@@ -186,7 +186,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.nxtlogseg = (uint32) atol(p);
+                       cluster->controldata.nxtlogseg = str2uint(p);
                        got_log_seg = true;
                }
                else if ((p = strstr(bufin, "Latest checkpoint's TimeLineID:")) != NULL)
@@ -197,7 +197,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.chkpnt_tli = (uint32) atol(p);
+                       cluster->controldata.chkpnt_tli = str2uint(p);
                        got_tli = true;
                }
                else if ((p = strstr(bufin, "Latest checkpoint's NextXID:")) != NULL)
@@ -211,7 +211,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        op++;                           /* removing ':' char */
-                       cluster->controldata.chkpnt_nxtxid = (uint32) atol(op);
+                       cluster->controldata.chkpnt_nxtxid = str2uint(op);
                        got_xid = true;
                }
                else if ((p = strstr(bufin, "Latest checkpoint's NextOID:")) != NULL)
@@ -222,7 +222,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.chkpnt_nxtoid = (uint32) atol(p);
+                       cluster->controldata.chkpnt_nxtoid = str2uint(p);
                        got_oid = true;
                }
                else if ((p = strstr(bufin, "Maximum data alignment:")) != NULL)
@@ -233,7 +233,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.align = (uint32) atol(p);
+                       cluster->controldata.align = str2uint(p);
                        got_align = true;
                }
                else if ((p = strstr(bufin, "Database block size:")) != NULL)
@@ -244,7 +244,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.blocksz = (uint32) atol(p);
+                       cluster->controldata.blocksz = str2uint(p);
                        got_blocksz = true;
                }
                else if ((p = strstr(bufin, "Blocks per segment of large relation:")) != NULL)
@@ -255,7 +255,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.largesz = (uint32) atol(p);
+                       cluster->controldata.largesz = str2uint(p);
                        got_largesz = true;
                }
                else if ((p = strstr(bufin, "WAL block size:")) != NULL)
@@ -266,7 +266,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.walsz = (uint32) atol(p);
+                       cluster->controldata.walsz = str2uint(p);
                        got_walsz = true;
                }
                else if ((p = strstr(bufin, "Bytes per WAL segment:")) != NULL)
@@ -277,7 +277,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.walseg = (uint32) atol(p);
+                       cluster->controldata.walseg = str2uint(p);
                        got_walseg = true;
                }
                else if ((p = strstr(bufin, "Maximum length of identifiers:")) != NULL)
@@ -288,7 +288,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.ident = (uint32) atol(p);
+                       cluster->controldata.ident = str2uint(p);
                        got_ident = true;
                }
                else if ((p = strstr(bufin, "Maximum columns in an index:")) != NULL)
@@ -299,7 +299,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.index = (uint32) atol(p);
+                       cluster->controldata.index = str2uint(p);
                        got_index = true;
                }
                else if ((p = strstr(bufin, "Maximum size of a TOAST chunk:")) != NULL)
@@ -310,7 +310,7 @@ get_control_data(migratorContext *ctx, ClusterInfo *cluster, bool live_check)
                                pg_log(ctx, PG_FATAL, "%d: controldata retrieval problem\n", __LINE__);
 
                        p++;                            /* removing ':' char */
-                       cluster->controldata.toast = (uint32) atol(p);
+                       cluster->controldata.toast = str2uint(p);
                        got_toast = true;
                }
                else if ((p = strstr(bufin, "Date/time type storage:")) != NULL)
index 1601d56b0812e4421291d980f8857aca48490535..55489ac1aa94448509688ea15c7f0a8860ddbd12 100644 (file)
@@ -242,7 +242,7 @@ get_db_infos(migratorContext *ctx, DbInfoArr *dbinfs_arr, Cluster whichCluster)
 
        for (tupnum = 0; tupnum < ntups; tupnum++)
        {
-               dbinfos[tupnum].db_oid = atol(PQgetvalue(res, tupnum, i_oid));
+               dbinfos[tupnum].db_oid = str2uint(PQgetvalue(res, tupnum, i_oid));
 
                snprintf(dbinfos[tupnum].db_name, sizeof(dbinfos[tupnum].db_name), "%s",
                                 PQgetvalue(res, tupnum, i_datname));
@@ -360,7 +360,7 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo,
                RelInfo    *curr = &relinfos[num_rels++];
                const char *tblspace;
 
-               curr->reloid = atol(PQgetvalue(res, relnum, i_oid));
+               curr->reloid = str2uint(PQgetvalue(res, relnum, i_oid));
 
                nspname = PQgetvalue(res, relnum, i_nspname);
                strlcpy(curr->nspname, nspname, sizeof(curr->nspname));
@@ -368,8 +368,8 @@ get_rel_infos(migratorContext *ctx, const DbInfo *dbinfo,
                relname = PQgetvalue(res, relnum, i_relname);
                strlcpy(curr->relname, relname, sizeof(curr->relname));
 
-               curr->relfilenode = atol(PQgetvalue(res, relnum, i_relfilenode));
-               curr->toastrelid = atol(PQgetvalue(res, relnum, i_reltoastrelid));
+               curr->relfilenode = str2uint(PQgetvalue(res, relnum, i_relfilenode));
+               curr->toastrelid = str2uint(PQgetvalue(res, relnum, i_reltoastrelid));
 
                tblspace = PQgetvalue(res, relnum, i_spclocation);
                /* if no table tablespace, use the database tablespace */
index a7d46cf2bc7b8ea67849fcd55ca09f624fdea32e..296b80f9834a0e7b31d3a452a66c40c4e14d99ad 100644 (file)
@@ -376,6 +376,8 @@ char           *pg_strdup(migratorContext *ctx, const char *s);
 void      *pg_malloc(migratorContext *ctx, int size);
 void           pg_free(void *ptr);
 const char *getErrorText(int errNum);
+unsigned int str2uint(const char *str);
+
 
 /* version.c */
 
index a69548b68c3b3efa88337152e53b2412c76ebd2f..dd605bbe3fcb038ba618b58eca5ee50ee825fe5f 100644 (file)
@@ -94,9 +94,9 @@ get_pg_database_relfilenode(migratorContext *ctx, Cluster whichCluster)
 
        i_relfile = PQfnumber(res, "relfilenode");
        if (whichCluster == CLUSTER_OLD)
-               ctx->old.pg_database_oid = atol(PQgetvalue(res, 0, i_relfile));
+               ctx->old.pg_database_oid = str2uint(PQgetvalue(res, 0, i_relfile));
        else
-               ctx->new.pg_database_oid = atol(PQgetvalue(res, 0, i_relfile));
+               ctx->new.pg_database_oid = str2uint(PQgetvalue(res, 0, i_relfile));
 
        PQclear(res);
        PQfinish(conn);
index b9968e9132c62f87e9337b3b6f7247feb829550e..3f3a4c700d07240cfc813eaf37d0f5c88b1edb40 100644 (file)
@@ -259,3 +259,15 @@ getErrorText(int errNum)
 #endif
        return strdup(strerror(errNum));
 }
+
+
+/*
+ *     str2uint()
+ *
+ *     convert string to oid
+ */
+unsigned int
+str2uint(const char *str)
+{
+       return strtol(str, NULL, 10);
+}