Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG]: Int32 overflow for Github object ids #2893

Closed
1 task done
Apolloluy opened this issue Mar 5, 2024 · 31 comments · Fixed by #2948
Closed
1 task done

[BUG]: Int32 overflow for Github object ids #2893

Apolloluy opened this issue Mar 5, 2024 · 31 comments · Fixed by #2948
Labels
Type: Bug Something isn't working as documented

Comments

@Apolloluy
Copy link

Apolloluy commented Mar 5, 2024

What happened?

Running

var envs = await github.Repository.Environment.GetAll(owner, "API_CICD");

Returns
image

System.OverflowException: 'Value was either too large or too small for an Int32.'
When attempting to parse the Github.id field in the response.

Versions

Octokit.nupkg 10.0.0 (.net)
image

Relevant log output

System.OverflowException
  HResult=0x80131516
  Message=Value was either too large or too small for an Int32.
  Source=System.Private.CoreLib
  StackTrace:
   at System.Convert.ThrowInt32OverflowException()

Value = 2398648970
{
			"id": 2398648970,
			"node_id": "EN_kwDOJhYfOc6O-HqK",
			"name": "test",
			"url": "https://api.github.com/repos/ContextureHIE/API_CICD/environments/test",
			"html_url": "https://github.com/ContextureHIE/API_CICD/deployments/activity_log?environments_filter=test",
			"created_at": "2024-03-01T22:23:36Z",
			"updated_at": "2024-03-01T22:23:36Z",
			"can_admins_bypass": true,
			"protection_rules": [
				{
					"id": 16441898,
					"node_id": "GA_kwDOJhYfOc4A-uIq",
					"type": "required_reviewers",
					"prevent_self_review": false,
					"reviewers": [
						{
							"type": "User",
							"reviewer": {
								"login": "Apolloluy",
								"id": 44653204,
								"node_id": "MDQ6VXNlcjQ0NjUzMjA0",
								"avatar_url": "https://avatars.githubusercontent.com/u/44653204?v=4",
								"gravatar_id": "",
								"url": "https://api.github.com/users/Apolloluy",
								"html_url": "https://github.com/Apolloluy",
								"followers_url": "https://api.github.com/users/Apolloluy/followers",
								"following_url": "https://api.github.com/users/Apolloluy/following{/other_user}",
								"gists_url": "https://api.github.com/users/Apolloluy/gists{/gist_id}",
								"starred_url": "https://api.github.com/users/Apolloluy/starred{/owner}{/repo}",
								"subscriptions_url": "https://api.github.com/users/Apolloluy/subscriptions",
								"organizations_url": "https://api.github.com/users/Apolloluy/orgs",
								"repos_url": "https://api.github.com/users/Apolloluy/repos",
								"events_url": "https://api.github.com/users/Apolloluy/events{/privacy}",
								"received_events_url": "https://api.github.com/users/Apolloluy/received_events",
								"type": "User",
								"site_admin": false
							}
						}
					]
				}
			],
			"deployment_branch_policy": null
		}

Code of Conduct

  • I agree to follow this project's Code of Conduct
@Apolloluy Apolloluy added Status: Triage This is being looked at and prioritized Type: Bug Something isn't working as documented labels Mar 5, 2024
@kfcampbell kfcampbell added Status: Up for grabs Issues that are ready to be worked on by anyone and removed Status: Triage This is being looked at and prioritized labels Mar 5, 2024
@jeffhandley
Copy link

Since this seems to repro using 10.0.0, it must be separate from #2889, which was fixed with #2890.

@kartheekp-ms
Copy link

kartheekp-ms commented May 13, 2024

Upgrading the octokit package version to 11.0.1 fixed the issue for me. https://www.nuget.org/packages/Octokit/11.0.1

kartheekp-ms referenced this issue in NuGet/Entropy May 15, 2024
@martincostello
Copy link
Contributor

I can still repro this with 11.0.1 for deployment environments. I have one with an ID of 2296494046 which overflows the Id property as it's still an int:

/// <summary>
/// Id of this deployment environment
/// </summary>
public int Id { get; private set; }

@martincostello
Copy link
Contributor

I would do a PR to fix it, but fixing it properly is a lottttttttt of breaking changes.

@wesProg23
Copy link

wesProg23 commented Jun 6, 2024

I still getting the error on version 11.0.1
When i call

await client.Issue.Comment.GetAllForIssue("myOrganization", "MyRepository", 195325)

or

await client.Issue.Comment.Create("myOrganization", "MyRepository", 195325, "Some Comment");
500 -    at System.Convert.ThrowInt32OverflowException()
   at System.Convert.ToInt32(Int64 value)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1437
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1492
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1519
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.SimpleJson.DeserializeObject(String json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) in /_/Octokit/SimpleJson.cs:line 584
   at Octokit.SimpleJson.DeserializeObject[T](String json, IJsonSerializerStrategy jsonSerializerStrategy) in /_/Octokit/SimpleJson.cs:line 596
   at Octokit.Internal.SimpleJsonSerializer.Deserialize[T](String json) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 22
   at Octokit.Internal.JsonHttpPipeline.DeserializeResponse[T](IResponse response) in /_/Octokit/Http/JsonHttpPipeline.cs:line 44
   at Octokit.Connection.Run[T](IRequest request, CancellationToken cancellationToken, Func`2 preprocessResponseBody) in /_/Octokit/Http/Connection.cs:line 752
   at Octokit.ApiConnection.GetPage[TU](Uri uri, IDictionary`2 parameters, String accepts, ApiOptions options, Func`2 preprocessResponseBody)
   at Octokit.ApiConnection.<>c__DisplayClass20_0`1.<<GetAll>b__0>d.MoveNext() in /_/Octokit/Http/ApiConnection.cs:line 240
--- End of stack trace from previous location ---
   at Octokit.ApiPagination.GetAllPages[T](Func`1 getFirstPage, Uri uri) in /_/Octokit/Clients/ApiPagination.cs:line 23\

@Eilon
Copy link
Contributor

Eilon commented Jun 6, 2024

Also having the issue here with 11.0.1.

We're calling gitHub.Issue.Comment.GetAllForIssue(owner, repo, number)

And for dotnet/maui#18618 we get the exception 'Value was either too large or too small for an Int32'

But dotnet/maui#22580 and dotnet/maui#20012 work fine.

@0x5bfa
Copy link

0x5bfa commented Jun 7, 2024

Also I'm getting this issue in 11.0.1

Calling Activity.Events.GetAllUserReceived().

   at System.Convert.ThrowInt32OverflowException()
   at System.Convert.ToInt32(Int64 value)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1437
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1492
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1492
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 190
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1492
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.PocoJsonSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/SimpleJson.cs:line 1519
   at Octokit.Internal.SimpleJsonSerializer.GitHubSerializerStrategy.DeserializeObject(Object value, Type type) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 205
   at Octokit.SimpleJson.DeserializeObject(String json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) in /_/Octokit/SimpleJson.cs:line 584
   at Octokit.SimpleJson.DeserializeObject[T](String json, IJsonSerializerStrategy jsonSerializerStrategy) in /_/Octokit/SimpleJson.cs:line 596
   at Octokit.Internal.SimpleJsonSerializer.Deserialize[T](String json) in /_/Octokit/Http/SimpleJsonSerializer.cs:line 22
   at Octokit.Internal.JsonHttpPipeline.DeserializeResponse[T](IResponse response) in /_/Octokit/Http/JsonHttpPipeline.cs:line 44
   at Octokit.Connection.Run[T](IRequest request, CancellationToken cancellationToken, Func`2 preprocessResponseBody) in /_/Octokit/Http/Connection.cs:line 752
   at Octokit.ApiConnection.GetPage[TU](Uri uri, IDictionary`2 parameters, String accepts, ApiOptions options, Func`2 preprocessResponseBody)
   at Octokit.ApiConnection.<>c__DisplayClass20_0`1.<<GetAll>b__0>d.MoveNext() in /_/Octokit/Http/ApiConnection.cs:line 240
--- End of stack trace from previous location ---
   at Octokit.ApiPagination.GetAllPages[T](Func`1 getFirstPage, Uri uri) in /_/Octokit/Clients/ApiPagination.cs:line 23
   at FluentHub.Octokit.Queries.Users.ActivityQueries.GetAllAsync(String login)
   at FluentHub.App.ViewModels.Viewers.DashBoardViewModel.LoadHomeContentsAsync()
   at FluentHub.App.ViewModels.Viewers.DashBoardViewModel.LoadUserHomePageAsync()

@naefp
Copy link

naefp commented Jun 8, 2024

bump. 👍🏼
same here, in my case at IssueComment in 11.0.1

@wesProg23
Copy link

I guess this issue is related: #2927
We noticed this same error in our Github Webhook.
Our labels id is too big for int, and we were getting conversion error. Changing int for long fixed our webhook.
I guess, its the same for octokit.

@martincostello
Copy link
Contributor

Yeah, it's now a general issue with the library. Various resources have gone past int.MaxValue for their IDs and now can't be interacted with if the request/response uses an ID bigger than that.

The fix would be simple, change all the ints to longs for anything representing an ID, but it's a hugely breaking change (would need to be a v12) and touches a lot of the code (when I did a quick look the other week, IIRC it would touch hundreds of files).

There'd only be any point doing such changing if the team would accept such a change, as otherwise it'd be a waste of people's effort.

@martincostello
Copy link
Contributor

@nickfloyd Thoughts?

@nickfloyd
Copy link
Contributor

nickfloyd commented Jun 10, 2024

Hey @martincostello it turns out that we had a lot more of these than first thought due to commit id / comment id being so prolific.

I'm working on a release (breaking change) this morning for the others.

@martincostello
Copy link
Contributor

Looks like this also affects the new .NET SDK too:

System.Text.Json.JsonException
  HResult=0x80131500
  Message=The JSON value could not be converted to System.Int32. Path: $ | LineNumber: 0 | BytePositionInLine: 10.
  Source=System.Text.Json
  StackTrace:
   at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, Utf8JsonReader& reader, Exception ex)
   at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetIntValue()
   at GitHub.Models.EnvironmentObject.<GetFieldDeserializers>b__42_3(IParseNode n)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.AssignFieldValues[T](T item)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetObjectValue[T](ParsableFactory`1 factory)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.<GetCollectionOfObjectValues>d__19`1.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at GitHub.Repos.Item.Item.Environments.EnvironmentsGetResponse.<GetFieldDeserializers>b__14_0(IParseNode n)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.AssignFieldValues[T](T item)
   at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetObjectValue[T](ParsableFactory`1 factory)
   at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.<SendAsync>d__20`1.MoveNext()
   at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.<SendAsync>d__20`1.MoveNext()
   at GitHub.Repos.Item.Item.Environments.EnvironmentsRequestBuilder.<GetAsync>d__4.MoveNext()

  This exception was originally thrown at this call stack:
    [External Code]

Inner Exception 1:
FormatException: Either the JSON value is not in a supported format, or is out of bounds for an Int32.

@jessehouwing
Copy link

Yeah, it's now a general issue with the library. Various resources have gone past int.MaxValue for their IDs and now can't be interacted with if the request/response uses an ID bigger than that.

The fix would be simple, change all the ints to longs for anything representing an ID, but it's a hugely breaking change (would need to be a v12) and touches a lot of the code (when I did a quick look the other week, IIRC it would touch hundreds of files).

There'd only be any point doing such changing if the team would accept such a change, as otherwise it'd be a waste of people's effort.

Unfortunately v12 just released. But I'd 👍🏼 a v13 to get this fixed across the board.

@nickfloyd
Copy link
Contributor

Looks like this also affects the new .NET SDK too:

System.Text.Json.JsonException
HResult=0x80131500
Message=The JSON value could not be converted to System.Int32. Path: $ | LineNumber: 0 | BytePositionInLine: 10.
Source=System.Text.Json
StackTrace:
at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, Utf8JsonReader& reader, Exception ex)
at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetIntValue() at GitHub.Models.EnvironmentObject.<GetFieldDeserializers>b__42_3(IParseNode n) at Microsoft.Kiota.Serialization.Json.JsonParseNode.AssignFieldValues[T](T item) at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetObjectValue[T](ParsableFactory1 factory)
at Microsoft.Kiota.Serialization.Json.JsonParseNode.d__191.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source)
at GitHub.Repos.Item.Item.Environments.EnvironmentsGetResponse.b__14_0(IParseNode n)
at Microsoft.Kiota.Serialization.Json.JsonParseNode.AssignFieldValues[T](T item)
at Microsoft.Kiota.Serialization.Json.JsonParseNode.GetObjectValue[T](ParsableFactory1 factory) at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.<SendAsync>d__201.MoveNext()
at Microsoft.Kiota.Http.HttpClientLibrary.HttpClientRequestAdapter.d__20`1.MoveNext()
at GitHub.Repos.Item.Item.Environments.EnvironmentsRequestBuilder.d__4.MoveNext()

This exception was originally thrown at this call stack:
[External Code]

Inner Exception 1:
FormatException: Either the JSON value is not in a supported format, or is out of bounds for an Int32.

Hey @martincostello would you mind providing the SDK call path that you were using in the new SDK. We haven't wired up "robust" error messages yet in the generative SDKs yet.

I see that you were calling GitHub.Repos.Item.Item.Environments but I was wondering if there was a specific object or public "condition" that I could use for a reproduction. It looks like some might've been missed or are using some OpenAPI descriptions that need to be updated.

Thanks for catching this / finding a use case in the new SDK as well ❤

@martincostello
Copy link
Contributor

@nickfloyd No worries. The repo isn't public so I can't link to it directly, but this is the relevant line:

var environments = (await github.Repos[owner][name].Environments.GetAsync())!.Environments!;

@nickfloyd
Copy link
Contributor

Yeah I just verified. It looks like we are missing the format attribute for that OpenAPI definition. I'm going to see if I can get an idea of how many are out of sync with the backing data.

I think the move forward here is to:

  1. Get a list of properties that should be int64/long
  2. Update Octokit.net (via pocos) and dotnet-sdk (via middleware)
  3. Ship both as having breaking changes
  4. At the same time update all of our OpenAPI to have the proper datatypes.

We could use a hammer and just update all of the id's to longs 😬️ but that has the potential to cause heaps of issues when we could be much more surgical here.

I'm going to start tracking down all of this and will come back with a more solid plan/execution.

Apologies for all of the trouble everyone. We'll get this cleaned up; thank you for the patience.

@nickfloyd
Copy link
Contributor

Just a quick follow up. I have found about 68 OpenAPI components that should have an Int64 formatter but do not. This means that there is a possibility that there are 68 endpoints used octokit.net that need their corresponding objects updated from int to long. I am working on putting together that list now.

As an aside, @kfcampbell and I are working on a few ways to prevent this from happening in the future. Apologies again for all of the trouble here.

@nickfloyd
Copy link
Contributor

We have determine that the following resources from the GitHub REST API are at risk of overflow issues. Some have been addressed, we'll need to see if there are other APIs/representations in octokit.net that need to be changed as well.

@nickfloyd
Copy link
Contributor

This #2941 should cover the remaining fields that were defined asint - that needed to be long.

@martincostello
Copy link
Contributor

The attached PR doesn't appear to address environments/deployments from its current title or contents.

@nickfloyd
Copy link
Contributor

Apologies... I should've clarified.

Deployments and environments had already been covered (including updating repository Id in those method signatures).

The items listed above represent resources where the OpenAPI definitions were not changed to match the backing data types - so "at risk" of being wrong in Octokit.net but needed research to find out.

The new PR fixes the existing issues in Octokit.net where the OpenAPI definitions were already changed but had not been updated in octokit.net.

The changes for the Generated SDKs (like the environments one above) should self correct once the changes that I made to the OpenAPI definitions ship to the rest_api_descriptions (should be in this changeset) repo and generation runs (every night).

Let me know if that matches up with what you were highlighting here.

@martincostello
Copy link
Contributor

Hmm - I'll need to recheck tomorrow. I thought deployments hadn't been fixed yet, maybe I misremembered. But the list in this comment doesn't reference a fix PR: #2893 (comment)

@martincostello
Copy link
Contributor

Yeah, this definitely isn't already fixed in v12.0.0 @nickfloyd.

The DTO still uses int:

public DeploymentEnvironment(int id, string nodeID, string name, string url, string htmlUrl, DateTimeOffset createdAt, DateTimeOffset updatedAt)
{
Id = id;
NodeId = nodeID;
Name = name;
Url = url;
HtmlUrl = htmlUrl;
CreatedAt = createdAt;
UpdatedAt = updatedAt;
}
/// <summary>
/// Id of this deployment environment
/// </summary>
public int Id { get; private set; }

If you look at https://api.github.com/repos/martincostello/dotnet-bumper/environments, you'll see the environment IDs are greater than int.MaxValue:

{
  "total_count": 2,
  "environments": [
    {
      "id": 2296494046
    },
    {
      "id": 2296498412
    }
  ]
}

@jessehouwing
Copy link

Yeah, this definitely isn't already fixed in v12.0.0 @nickfloyd.

The DTO still uses int:

public DeploymentEnvironment(int id, string nodeID, string name, string url, string htmlUrl, DateTimeOffset createdAt, DateTimeOffset updatedAt)
{
Id = id;
NodeId = nodeID;
Name = name;
Url = url;
HtmlUrl = htmlUrl;
CreatedAt = createdAt;
UpdatedAt = updatedAt;
}
/// <summary>
/// Id of this deployment environment
/// </summary>
public int Id { get; private set; }

If you look at https://api.github.com/repos/martincostello/dotnet-bumper/environments, you'll see the environment IDs are greater than int.MaxValue:

{
  "total_count": 2,
  "environments": [
    {
      "id": 2296494046
    },
    {
      "id": 2296498412
    }
  ]
}

Also reported here recently

@nickfloyd
Copy link
Contributor

nickfloyd commented Jun 25, 2024

Thanks for the catch @martincostello & @jessehouwing - not sure how I missed it but I did, thanks for helping to round out the corners on this. I'm going to put the PR back into draft, do another sweep to make sure I catch what you found and possibly others and then open it back up for a review.

Apologies for the delay and thanks again for the follow up ❤

@nickfloyd
Copy link
Contributor

Just an FYI: I found the flaw in my analysis scripts. I was only looking at migrations - where ids shifted from int32 to int64 I completely left out the base structure SQL - the initialization of the database itself 🤦🏼‍♂️️

I was able to find a few more and will be updating those as well:

  • PreReceiveHook
  • Deployment Environments
  • Repository
  • Org Team
  • Repo Invitations
  • Public Key
  • Project Cards
  • Organization Invitation
  • Migrations
  • GpgKey
  • Deployment
  • Authorizations
  • Accounts / Profiles
  • Codespace / Workspaces

This will make for a pretty big change set but I feel that's better than introducing more (smaller) major releases for this effort - that feels like it would create extra noise and confusion given things would still be broken until they were all shipped complete.

@nickfloyd nickfloyd removed the Status: Up for grabs Issues that are ready to be worked on by anyone label Jun 25, 2024
@nickfloyd
Copy link
Contributor

The PR should be good to go now... this should hopefully cover all areas above.

@nickfloyd
Copy link
Contributor

I've got one more round of changes to octokit.net before I close this out. It will handle two thing:

  1. Any nonstandardized named parameter like what @joscol found
  2. Any parameters and their types named number - I am renaming so that they actually represent what they are commentId, commitId, pullRequestId and so on.

@nickfloyd
Copy link
Contributor

nickfloyd commented Jul 1, 2024

Thanks @0x5bfa! It does. The backing API sometimes uses the strict Id when dealing with the resource itself (these are typically of type int64|long|bigint - like with the issues API for instance, but will use the scoped id named number to refer to a resource that is contained within another resource - as in repo/issues, int32 | int

I'm trying to track and parse out which should be which and ensure that their types are accurate and they are named appropriately. Given the one @joscol found It's prompted me to review the entire SDK to ensure it is doing what it should.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: Bug Something isn't working as documented
Projects
Archived in project