diff --git a/contrib/tsearch2/snowball/api.c b/contrib/tsearch2/snowball/api.c
index 5cbf37d73bf123ab7f4f5dac0fa716fa5b3772d6..426341a360b41e60990676d984533618f9275cb9 100644
--- a/contrib/tsearch2/snowball/api.c
+++ b/contrib/tsearch2/snowball/api.c
@@ -6,39 +6,63 @@ extern struct SN_env *
 SN_create_env(int S_size, int I_size, int B_size)
 {
 	struct SN_env *z = (struct SN_env *) calloc(1, sizeof(struct SN_env));
+	struct SN_env *z2 = z;
+
+	if (!z)
+		return z;
 
 	z->p = create_s();
-	if (S_size)
+	if (!z->p)
+		z = NULL;
+
+	if (z && S_size)
 	{
-		z->S = (symbol * *) calloc(S_size, sizeof(symbol *));
+		if ((z->S = (symbol * *) calloc(S_size, sizeof(symbol *))))
 		{
 			int			i;
 
 			for (i = 0; i < S_size; i++)
-				z->S[i] = create_s();
+			{
+				if (!(z->S[i] = create_s()))
+				{
+					z = NULL;
+					break;
+				}
+			}
+			z2->S_size = i;
 		}
-		z->S_size = S_size;
+		else
+			z = NULL;
 	}
 
-	if (I_size)
+	if (z && I_size)
 	{
 		z->I = (int *) calloc(I_size, sizeof(int));
-		z->I_size = I_size;
+		if (z->I)
+			z->I_size = I_size;
+		else
+			z = NULL;
 	}
 
-	if (B_size)
+	if (z && B_size)
 	{
 		z->B = (symbol *) calloc(B_size, sizeof(symbol));
-		z->B_size = B_size;
+		if (z->B)
+			z->B_size = B_size;
+		else
+			z = NULL;
 	}
 
+	if (!z)
+		SN_close_env(z2);
+
 	return z;
 }
 
 extern void
 SN_close_env(struct SN_env * z)
 {
-	if (z->S_size)
+	if (z->S && z->S_size)
 	{
 		{
 			int			i;
diff --git a/contrib/tsearch2/snowball/utilities.c b/contrib/tsearch2/snowball/utilities.c
index 4ec71dc7934f78d8f81b2ab3c6e3badd3bb17264..4d031f1c9c11d3e9683b1317f69edc1dfcaf2b7f 100644
--- a/contrib/tsearch2/snowball/utilities.c
+++ b/contrib/tsearch2/snowball/utilities.c
@@ -14,6 +14,8 @@ create_s(void)
 {
 	symbol	   *p = (symbol *) (HEAD + (char *) malloc(HEAD + (CREATE_SIZE + 1) * sizeof(symbol)));
 
+	if (p == (symbol *) (HEAD))
+		return NULL;
 	CAPACITY(p) = CREATE_SIZE;
 	SET_SIZE(p, CREATE_SIZE);
 	return p;
diff --git a/contrib/tsearch2/ts_cfg.c b/contrib/tsearch2/ts_cfg.c
index 1d3ca86a095aecc3504eeb0f34068eac1e91884a..6ff25b2b166de0f8ce04e79bb4aa062c86258a25 100644
--- a/contrib/tsearch2/ts_cfg.c
+++ b/contrib/tsearch2/ts_cfg.c
@@ -112,6 +112,9 @@ init_cfg(Oid id, TSCfgInfo * cfg)
 
 		cfg->map[lexid].len = ARRNELEMS(a);
 		cfg->map[lexid].dict_id = (Datum *) malloc(sizeof(Datum) * cfg->map[lexid].len);
+		if (!cfg->map[lexid].dict_id)
+				ts_error(ERROR, "No memory");
+
 		memset(cfg->map[lexid].dict_id, 0, sizeof(Datum) * cfg->map[lexid].len);
 		ptr = (text *) ARR_DATA_PTR(a);
 		oldcontext = MemoryContextSwitchTo(TopMemoryContext);